2012-11-15 104 views
0

從我的視圖調用時,爲什麼不生成表格?用fields_table(@user,[「id」,「username」])我沒有得到tbody的trs或tds,但是我得到了一切。在Ruby on Rails中生成表格

def fields_table(obj, fields) 
    return false if obj.nil? 
    content_tag(:table) do 
    thead = content_tag(:thead) do 
     content_tag(:tr) do 
     content_tag(:td, "Property") + content_tag(:td, "Value") 
     end 
    end 
    tbody = content_tag(:tbody) do 
     fields.each do |name| 
     content_tag(:tr) do 
      content_tag(:td, name) + content_tag(:td, obj.read_attribute(name)) 
     end 
     end 
    end 
    thead + tbody 
    end 
end 

回答

0

此代碼只是遍歷字段。它不會返回任何東西,因此封閉tbody不會有任何內容。

tbody = content_tag(:tbody) do 
    fields.each do |name| 
    content_tag(:tr) do 
     content_tag(:td, name) + content_tag(:td, obj.read_attribute(name)) 
    end 
    end 
end 

你需要像你這樣返回的東西在代碼的其他部分或改變它的東西是這樣的:

tbody = content_tag(:tbody) do 
    fields.map do |name| 
    content_tag(:tr) do 
     content_tag(:td, name) + content_tag(:td, obj.read_attribute(name)) 
    end 
    end.join 
end 
+0

出於某種原因,HTML被轉義,但只在TBODY。我試圖調試,但也許你知道爲什麼? – Dave

+0

谷歌「html_safe」,在那裏有一個不可信的字符串,所以它不再安全地顯示。您可以通過將「.html_safe」附加到這些方法並從那裏進行修復。 –

0

我會建議使用採集參數渲染的部分,並建立在鐵軌善良做這種類型的操作。我猜你想要表標題與字段排隊?你仍然可以通過以下方式來做到這一點(未經測試,但應該工作),

在你的模型中定義一個類方法或數組作爲包含你想要在前端顯示的屬性的常量。

型號/ user.rb

VisibleFields = [:id, :username] 

#workaround for toplevel class constant warning you may get 
def self.visible_fields 
    User::VisibleFields 
end 

的意見/用戶/ index.html.erb

<table> 
    <thead> 
    <tr> 
    <% User.visible_fields.each do |field| %> 
     <th><%= field.to_s.titleize %></th> 
    <% end %> 
    </tr> 
    </thead> 
<tbody> 
<%= render :partial => 'user', :collection => @users %> 
</tbody> 
</table> 

**views/users/_user.html.erb** 

<tr> 
<% user.visible_fields.each do |field| %> 
    <td class="label"><%= field.to_s.titleize %></td><td class="value"><%= user.send(:field) %></td> 
<% end %> 
</tr>