我被困了......
我正在尝试在我的应用程序助手中创建一个表助手,如下所示:
def simple_grid(theGrid, theData)
content_tag :div, :class => "text_area_show" do
content_tag :table, :width => "95%" do
concat content_tag :tr, "" do
theGrid['fields'].each do |field|
concat content_tag(:th, field)
end
end
theData.collect do |record|
concat content_tag :tr do
theGrid['fields'].collect do |field|
concat content_tag(:td, record[field], :align => "center")
end
theGrid['right_links'].collect do |right_link,path|
case right_link
when 'show'
concat content_tag(:td, link_to(right_link, "#{path}#{record.id}"), :align => "center")
when 'edit'
concat content_tag(:td, link_to(right_link, "#{path}#{record.id}/edit"), :align => "center")
end
end
end
end
end
end
end
在我的控制器中使用它:
@users = User.all
@grid = {'fields' => ['firstname','lastname','email'],
'right_links' => {'show' => '/admin/users/', 'edit' => '/admin/users/'}
}
这在我看来:
<%= simple_grid(@grid, @users) %>
这会生成以下html:
<div class="text_area_show"><table width="95%"><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr><tr></tr></table></div>
我想念所有的td标签。
任何帮助告诉我的错误都会受到高度赞赏!
尼古拉斯。
答案 0 :(得分:1)
这是我首先做的,但作为Rails的新手,我正在尝试Rails方式......
我发现的最佳解决方案是:
def simple_grid(theGrid, theData)
content_tag :div, :class => "text_area_show" do
concat(content_tag(:table, :width => "95%") do
concat(content_tag(:tr) do
theGrid['fields'].collect do |field|
concat(content_tag(:th, field))
end
end)
theData.collect do |record|
concat(content_tag(:tr) do
theGrid['fields'].collect do |field|
concat(content_tag(:td, record[field], :align => "center"))
end
theGrid['right_links'].collect do |right_link,path|
case right_link
when 'show'
concat(content_tag(:td, link_to(right_link, "#{path}#{record.id}"), :align => "center"))
when 'edit'
concat(content_tag(:td, link_to(right_link, "#{path}#{record.id}/edit"), :align => "center"))
end
end
end)
end
end)
end
end
这很丑陋但是有效。欢迎任何建议做更好的工作!
答案 1 :(得分:1)
content_tag
仅适用于简单的帮助者。对于复杂的帮助者,使用部分帮助更好:
def simple_grid( grid, data )
render partial: '/shared/simple_grid', locals: { grid: grid, data: data }
end
这样您就可以利用自己喜欢的模板引擎了。请注意,我通常将这些部分存储在“app / views”中的“共享”文件夹中,但这取决于您。在这种情况下,帮助程序甚至不是必需的,但是在您需要在渲染之前处理数据时,它可能很有用。
另一种方法是装饰器模式(使用Draper gem),但它是另一个主题。
答案 2 :(得分:0)
由于多个content_for标记,有一段时间试图解决您的问题。请阅读API文档,您需要始终使用.collect而不是.each,并且对于块中的多个content_for标记,您需要使用concat ...但尽可能尝试,我也无法使用它...
最后的手段,你总是可以回到:
@output = "<div class='text_area_show'>
<table width='95%'>
<tr>"
theGrid['fields'].each { |field| @output += "<th>#{field}</th>"}
@output += "</tr>"
theData.collect do |record|
@output += "<tr>"
theGrid['fields'].each { |field| @output += "<td align='center'>#{record[field]}</td>"}
theGrid['right_links'].collect do |right_link,path|
case right_link
when 'show'
@output += "<td align='center'>#{link_to(right_link, "#{path}#{record.id}")}</td>"
when 'edit'
@output += "<td align='center'>#{link_to(right_link, "#{path}#{record.id}/edit")}</td>"
end
end
@output += "</tr>"
end
@output += "</table></div>"
@output