在我们的应用程序中,我们显示的输入如下:
<%= 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时,它正确地呈现了跨度。不知怎的,它无法同时渲染它们。
答案 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