通过轨道部分生成具有唯一标头和单元格的表格

时间:2016-02-25 00:52:24

标签: ruby-on-rails partials

我有一个标准的表格布局,我想在我的索引视图中使用4种不同的资源。我创建了一个index_table partial,它使用locals来提供:

  • 表标题
  • 表格标题
  • 表对象(例如@users)
  • 表格单元格

<%= render 'shared/index_table', scope_title: 'All Debts', table_headers: ['ID', 'Debtor', 'Amount', 'Status', 'Stage', ''], table_objects: @debts, table_cells: ['id', 'debtor.name', 'amount', 'status', 'stage'] %>

除了表格单元格之外的所有单元格都在工作,我遇到的问题当然是单元格显示为Object.id,而不是实际的对象ID。

<table class="table table-striped table-bordered table-hover" id="sample_3">
    <thead>
        <tr>
          <% table_headers.each do |table_header| %>
            <th> <%= table_header %> </th>
          <% end %>
        </tr>
    </thead>
    <tbody>
      <% table_objects.each do |object| %>
        <tr>
          <% table_cells.each do |cell| %>
            <td> <%= object %>.<%= cell %> </td>
          <% end %>
          <td>
            <a href="javascript:;" class="btn btn-outline btn-sm blue">
            <i class="fa fa-share"></i> View </a>
            <a href="javascript:;" class="btn btn-outline btn-sm green-jungle">
            <i class="fa fa-edit"></i> Edit </a>
            <a href="javascript:;" class="btn btn-outline btn-sm red-mint">
            <i class="fa fa-trash"></i> Delete </a>
          </td>
        </tr>
      <% end %>
    </tbody>
</table>

非常感谢任何输入。

还有一种更优雅的方式,或者这是甚至建议的东西吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

更改

<td> <%= object %>.<%= cell %> </td>

<td> <%= object.send(cell) %> </td>

修改

我试图轻易回答你的问题,但我会更深入地了解你应该如何做这整件事。你首先设置它的方式并不完全“正确”,而且最有可能是这个问题被投票的原因。

首先,您不希望通过本地提供所有这些变量。它变得很麻烦,视图不适合这种逻辑。你知道你要发送到部分模型的模型列表,所以只需将其传递给你调用部分的所有4个案例。想出一个名称,它封装了所有4种类型的对象所代表的内容,但就我的例子而言,我将其称为objects

<%= render 'shared/index_table', objects: @debts %>

现在,在模型中,为要在部分中显示的每个属性创建一个显示方法。

def self.scope_title 
  'All Debts'
end

def self.table_headers
  ['ID', 'Debtor', 'Amount', 'Status', 'Stage', '']
end

def table_cells
  [id, debtor.name, amount, status, stage]
end

在模型中使用这些功能可以做一些事情。

  1. 您可以测试这些方法
  2. 您可以在自己所属的位置编写自定义逻辑
  3. 将评估字段,就好像它们前面有self.一样。这意味着您的debtor.name字段将在数组中返回它的值。
  4. 在最后一点上,您还可以检查此处是否存在debtor,以便在没有关系时不会中断:debtor.try(:name)

    现在在你看来

    <% objects.first.class.table_headers.each do |table_header| %>
    
    <% objects.each do |object| %>
        ...
        <% object.table_cells.each do |cell| %>
            <td> <%= cell %> </td>
    

    最后2个超出此问题范围的优化:

    1. 创建一个超类class ObjectDisplay(更改名称Object)并将这些显示方法作为存根放在其中。
    2. 为每种类型的对象制作显示类,并在其中制作显示方法。 class DebtDisplay < ObjectDisplay