我有一个标准的表格布局,我想在我的索引视图中使用4种不同的资源。我创建了一个index_table partial,它使用locals来提供:
<%= 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>
非常感谢任何输入。
还有一种更优雅的方式,或者这是甚至建议的东西吗?
感谢您的帮助!
答案 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
在模型中使用这些功能可以做一些事情。
self.
一样。这意味着您的debtor.name
字段将在数组中返回它的值。在最后一点上,您还可以检查此处是否存在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个超出此问题范围的优化:
class ObjectDisplay
(更改名称Object)并将这些显示方法作为存根放在其中。class DebtDisplay < ObjectDisplay