我在应用程序助手中定义了函数:
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
我在我的观点中称之为:
<%= display_standard_table(
[
{ :name => '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中的输出是:
<table><thead></thead><tbody></tbody></table>
应该是:
<table><thead><tr><td>Id</td><td>Login</td>...</tr></thead><tbody><tr>row here</tr></tbody></table>
我无法弄清楚缺少什么。 (顺便说一下。我正在使用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,但是它们被转义:/
答案 0 :(得分:31)
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
答案 1 :(得分:5)
实际上你只是在内容标签之间缺少一个加号,你可以在这里找到类似的问题
问题在于,由于您使用块的方式,可能会出现语法错误,如果使用“{}”而不是“do end”语句,则可能会出现问题。< / p>
在这里(Change to the way the block is handled),您可以在使用Rails 3的情况下找到示例和解决方法,因为显然Rails 3在内容标记内部时会忽略collect语句的结果。
答案 2 :(得分:1)
请参阅railscast:http://railscasts.com/episodes/208-erb-blocks-in-rails-3所有内容都解释了如何在rails 3中管理块帮助器
答案 3 :(得分:0)
concat
相关:tr
中的缺失 content_tag
。
更新
至于逃跑,请查看api docs for content_tag
。你需要指定不要逃避它。当然,在这种情况下,你有责任逃避你想要转义的标签内的内容。
答案 4 :(得分:0)
将'.join()。html_safe'添加到每个收集部分的末尾。这对我有用。
collection.collect { |elem|
concat content_tag(:tr, columns.collect { |column|
content_tag(:td, elem.attributes[column[:name]])
})
}.join().html_safe