Rails嵌套的content_tag


84

我正在尝试将内容标签嵌套到自定义帮助程序中,以创建如下内容:

<div class="field">
   <label>A Label</label>
   <input class="medium new_value" size="20" type="text" name="value_name" />
</div>

请注意,输入与表单无关,它将通过javascript保存。

这是帮助器(它将执行更多操作,然后仅显示html):

module InputHelper
    def editable_input(label,name)
         content_tag :div, :class => "field" do
          content_tag :label,label
          text_field_tag name,'', :class => 'medium new_value'
         end
    end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

但是,当我呼叫助手时,标签未显示,仅显示输入。如果注释掉了text_field_tag,则显示标签。

谢谢!

Answers:


155

您需要+快速修复:D

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      content_tag(:label,label) + # Note the + in this line
      text_field_tag(name,'', :class => 'medium new_value')
    end
  end
end

<%= editable_input 'Year Founded', 'companyStartDate' %>

在的块内content_tag :div,将仅显示最后返回的字符串。


1
错字(在评论而已,但稍微有一些混乱) - “不ê的+在此行”
Chowlett

添加完之后,我得到语法错误:语法错误,意外的tIDENTIFIER,预期的kDO或'{'或'('text_field_tag name,''
,:

2
感觉很脏...是因为它是帮助程序构建多个内容标签的反模式?
Erik Trautman 2014年

没为我工作,必须concat像其他答案一样使用
Dex,

55

您还可以使用concat方法:

module InputHelper
  def editable_input(label,name)
    content_tag :div, :class => "field" do
      concat(content_tag(:label,label))
      concat(text_field_tag(name,'', :class => 'medium new_value'))
    end
  end
end

来源:在Rails 3中嵌套content_tag


只要concat行位于1行上,这对我就有效。不过,我并没有花很长时间玩,所以可能有一种方法可以多行处理
-TerryS

考虑到html_safe问题,这将是更好的方法。+在非htmlsafe字符串之间使用将使所有内容都不为htmlsafe
Tian Chen

如果您在表单构建器类中,则应该为@template.concat
elquimista

我认为这是一种更清洁的解决方案+。更具可读性且Rubocop不喜欢+
escanxr

2

我使用变量和concat来帮助进行更深层的嵌套。

def billing_address customer
  state_line = content_tag :div do
    concat(
      content_tag(:span, customer.BillAddress_City) + ' ' +
      content_tag(:span, customer.BillAddress_State) + ' ' +
      content_tag(:span, customer.BillAddress_PostalCode)
    )
  end
  content_tag :div do
    concat(
      content_tag(:div, customer.BillAddress_Addr1) +
      content_tag(:div, customer.BillAddress_Addr2) +
      content_tag(:div, customer.BillAddress_Addr3) +
      content_tag(:div, customer.BillAddress_Addr4) +
      content_tag(:div, state_line) +
      content_tag(:div, customer.BillAddress_Country) +
      content_tag(:div, customer.BillAddress_Note)
    )
  end
end

1

使用迭代构建嵌套的内容标签有点不同,每次都会得到我的帮助...这是一种方法:

      content_tag :div do
        friends.pluck(:firstname).map do |first| 
          concat( content_tag(:div, first, class: 'first') )
        end
      end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.