嵌套的content_tag设计表

时间:2011-04-06 21:09:40

标签: ruby-on-rails

我被困了......

我正在尝试在我的应用程序助手中创建一个表助手,如下所示:

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标签。

任何帮助告诉我的错误都会受到高度赞赏!

尼古拉斯。

3 个答案:

答案 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