2011-04-06 75 views
2

我卡住了...嵌套content_tag設計表

我想創建這樣在我的應用助手錶幫手:

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標籤。

任何幫助告訴我什麼是錯誤將不勝感激!

Nicolas。

回答

0

由於存在多個content_for標籤,有一段時間試圖解決您的問題的惡夢。閱讀API文檔,您需要始終使用.collect而不是.each,並且需要使用concat的塊中的多個content_for標籤...但儘可能地嘗試,我也無法使用它。

不得已,你總是可以回落到:

@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 
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

content_tag只適合簡單的助手。對於複雜的幫助者來說,使用局部變得更好:

def simple_grid(grid, data) 
    render partial: '/shared/simple_grid', locals: { grid: grid, data: data } 
end 

所以你可以利用你最喜歡的模板引擎。請注意,我通常將這些部分存儲在「app/views」中的「共享」文件夾中,但這取決於您。在這種情況下,幫助程序甚至不是強制性的,但在需要在呈現之前處理數據的時候,它可能很有用。

另一種方法是裝飾模式(使用Draper gem),但它是另一個主題。