Rails label_tag do on helper只渲染部分内容

时间:2017-04-05 06:09:24

标签: ruby-on-rails

在我们的应用程序中,我们显示的输入如下:

<%= f.label :date, class: 'field' do %>
  <span>Date</span>
  <%= f.text_field :date %>
<% end %>

这种情况经常重复,所以我决定将它放在一个帮助器中,如下所示:

def text_field_for(attribute, title, form, value = nil)
  form.label attribute, class: 'field' do
    content_tag(:span, title)
    form.text_field attribute, value: value
  end
end

然而,这将依赖于html:

<label class="field" for="my_object_date">
  <input type="text" name="my_object[date]" id="my_object_date" />
</label>

为什么它不渲染span标签?当我注释掉text_field时,它正确地呈现了跨度。不知怎的,它无法同时渲染它们。

3 个答案:

答案 0 :(得分:2)

在方法中的两行之前添加concat,如下所示:

def text_field_for(attribute, title, form, value = nil)
  form.label attribute, class: 'field' do
    concat( content_tag(:span, title) )
    concat( form.text_field attribute, value: value )
  end
end

如果使用concat,它将连接标签块中生成的每个HTML块。

没有它,我只把最后一行作为内容。 (如return form.text_field attribute, value: value

答案 1 :(得分:0)

当您制作自己的助手时,您需要使用concat才能向该块添加额外内容。

这样的事情应该有效:

def text_field_for(attribute, title, form, value = nil)
  form.label attribute, class: 'field' do
    concat(content_tag(:span, title))
    concat(form.text_field attribute, value: value)
  end
end

Concat会将内容添加到输出缓冲区,类似于<%= content %>在模板文件中的操作方式。

如果您以后想要做这样的事情但是没有阻止,则需要使用capture以便捕获内容并将其呈现给页面。

def another_helper
  capture do
    concat link_to("Star wars", star_wars_path)
    concat link_to("Star trek", star_trek_path)
  end
end

答案 2 :(得分:0)

只从块返回最后一个语句。您可以使用以下两者结合使用:

form.label attribute, class: 'field' do
  content_tag(:span, title) + form.text_field(attribute, value: 'bar')
end

form.label attribute, class: 'field' do
  content_tag(:span, title).concat(form.text_field(attribute, value: 'bar'))
end