rails,如何使用content_tag在帮助器中构建表?

我在应用程序助手中定义了函数:

def display_standard_table(columns, collection = {}) content_tag :table do concat content_tag :thead do content_tag :tr do concat columns.collect { |column| content_tag(:td, column[:display_name]) } end end concat content_tag :tbody do collection.collect { |elem| concat content_tag(:tr, columns.collect { |column| content_tag(:td, elem.attributes[column[:name]]) }) } end end end 

我在我的观点中称之为:

  'id', :display_name => 'Id' }, { :name => 'login', :display_name => 'Login' }, { :name => 'first_name', :display_name => 'Name' }, { :name => 'last_name', :display_name => 'LastName' }, { :name => 'email', :display_name => 'Email'} ], @users) %> 

html中的输出是:

 

它应该是:

 ...row here
IdLogin

我无法弄清楚缺少什么。 (顺便说一下。我正在使用rails3)

[编辑]

 def display_standard_table(columns, collection = {}) content_tag(:table) do concat(content_tag(:thead) do concat(content_tag(:tr) do concat(columns.collect { |column| content_tag(:td, column[:display_name]) }) end) end) concat(content_tag(:tbody) do concat(collection.collect { |elem| content_tag(:tr, columns.collect { |column| content_tag(:td, elem.attributes[column[:name]]) }) }) end) end end 

上面的版本工作正常,但生成的html被转义:/根据content_tag生成的文档字符串应该是html_safe,但是它们被转义:/

 def display_standard_table(columns, collection = {}) thead = content_tag :thead do content_tag :tr do columns.collect {|column| concat content_tag(:th,column[:display_name])}.join().html_safe end end tbody = content_tag :tbody do collection.collect { |elem| content_tag :tr do columns.collect { |column| concat content_tag(:td, elem.attributes[column[:name]]) }.to_s.html_safe end }.join().html_safe end content_tag :table, thead.concat(tbody) end 

实际上你只是在内容标签之间缺少一个加号,你可以在这里找到类似的问题

Rails嵌套的content_tag

这个的问题是,由于你使用块的方式,你可能会得到一个语法错误,如果你使用“{}”而不是“do end”语句你将会是好的。

在这里( 更改为块的处理方式 )您可以在使用Rails 3的情况下找到示例和解决方法,因为显然Rails 3在内容标记内部时忽略了collect语句的结果。

请参阅railscast: http ://railscasts.com/episodes/208-erb-blocks-in-rails-3所有内容都解释了如何在rails 3中管理块助手

这是你的:tr相关content_tag 缺少的 concat

更新

至于转义,请查看content_tag的api文档 。 你需要指定不要逃避它。 当然,在这种情况下,你有责任逃避你想要转义的标签内的东西。

将’.join()。html_safe’添加到每个收集部分的末尾。 这对我有用。

  collection.collect { |elem| concat content_tag(:tr, columns.collect { |column| content_tag(:td, elem.attributes[column[:name]]) }) }.join().html_safe