在Ruby on Rails中生成表

时间:2012-11-15 02:56:04

标签: ruby-on-rails ruby

为什么从我的视图调用时这不会产生表格?使用fields_table(@ user,[“id”,“username”])我没有得到tbody's trs或tds,但我得到了其他所有内容。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我建议使用collection参数渲染部分,并建立rails goodness来执行此类操作。我猜你想让桌面标题与字段对齐吗?您仍然可以通过以下方式执行此操作(未经过测试,但应该可以使用),

在您的模型中,将类方法或数组定义为包含要在前端显示的属性的常量,例如

<强>模型/ 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>