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中的输出是:
它应该是:
Id Login ...row here
我无法弄清楚缺少什么。 (顺便说一下。我正在使用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