带有Rails帮助器的嵌套HTML元素

时间:2015-09-18 22:00:24

标签: html ruby-on-rails ruby ruby-on-rails-4

我正在使用Rails html帮助器创建一个简单的html结构,其中包含labelselectoptgroups(这是唯一稍微复杂的部分)。

然后我创建了一个名为resources_optgroup的帮助器。我想要一个像这样的输出:

<div>
    <label>Something</label>
    <select name="something">
        <optgroup label="something">
            <option value="1">something</option>
            <option value="2">something</option>
            <option value="3">something</option>
        </optgroup>
        <optgroup label="something">
            <option value="1">something</option>
            <option value="2">something</option>
            <option value="3">something</option>
        </optgroup>
    </select>
</div>

这是我的Rails代码。我不能同时使标签和选择标签协同工作。这是什么?

def collection_link(item,site)
      content_tag :div, class: '' do
        label_tag item['title']

        content_tag(:select) do
            concat resources_optgroup site, Page
            concat resources_optgroup site, Category
            concat resources_optgroup site, Post
            concat resources_optgroup site, Product
            concat resources_optgroup site, Service
        end
    end
  end

1 个答案:

答案 0 :(得分:1)

这些方法返回字符串,您的方法返回最后执行的内容。如果你想要它,你需要连接你的字符串。这可能会导致html_safe调用和其他丑陋的混乱。更好的解决方案是将HTML生成移动到视图部分,并从帮助程序中呈现它。您可以将任何计算或变量信息作为本地传递。

按要求 - 如果你真的想在帮手中做这个,而不使用视图代码(尽管它是视图代码),你可以这样做:

def collection_link(item,site)
  content_tag :div, class: '' do
    label_tag(item['title']) +

    content_tag(:select) do
        resources_optgroup(site, Page) +
        resources_optgroup(site, Category) +
        resources_optgroup(site, Post) +
        resources_optgroup(site, Product) +
        resources_optgroup(site, Service)
    end
  end
end

这几乎肯定会创建html转义问题......