如何将我的namespaced / resouce / index.html.erb内容导出到CSV文件中,该内容使用索引页上每行的部分内容,而不会在CSV的视图文件中复制代码(或以任何方法输出CSV)?
控制器如下所示:
class Namespaced::ResourceController < AncestorController
def index
@rows = current_object.rows.some_scope.page(params[:page])
respond_to do |format|
format.html
format.csv do
headers['Content-Disposition'] = "attachment; filename=\"filename.csv\""
headers['Content-Type'] ||= 'text/csv'
end
end
end
end
索引视图只列出表头:
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<table class="table">
<thead>
<tr>
<th>
<strong>Order ID</strong>
</th>
<th>
<strong>Order Date</strong>
</th>
<th>
<strong>Description</strong>
</th>
<th>
<strong>Price</strong>
</th>
<th>
<strong>Shipping</strong>
</th>
<th>
<strong>Tax</strong>
</th>
<th>
<strong>Total</strong>
</th>
<th>
<strong>Status</strong>
</th>
</tr>
</thead>
<tbody>
<%= render partial: "row", collection: @rows %>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-lg-12">
Download: <%= link_to 'CSV', namespaced_resource_path(format: :csv) %>
</div>
</div>
</div>
部分HTML视图如下所示:
<tr>
<td>
<%= row.order_id %>
</td>
<td>
<%= row.row_date %>
</td>
<td>
<%= row.description %>
</td>
<td>
<%= row.price %>
</td>
<td>
<%= row.shipping %>
</td>
<td>
<%= row.tax %>
</td>
<td>
<%= row.calculate_total %>
</td>
<td>
<%= row.status %>
</td>
</tr>
...并且CSV视图是这样的:
<%- headers = ['Order ID', 'Order Date', 'Description', 'Price', 'Shipping', 'Tax', 'Total', 'Status'] -%>
<%= CSV.generate_line headers %>
<%- @rows.each do |entry| -%>
<%= CSV.generate_line([
row.order_id,
row.row_date,
row.description,
row.price,
row.shipping,
row.tax,
row.calculate_total,
row.status
]) -%>
<%- end -%>
请注意用于部分HTML视图和CSV视图的相同属性/回调。其中一些是相对复杂的装饰器/辅助器回调,可能会更改/被省略/将来添加更多。标题也会在两个地方添加(并且它们不仅仅是数据模型的属性)。基本上,这个局部视图和CSV视图显示代码重复。
虽然我可以想到一些填充列标题并使用相同回调函数的技术,但我不确定它是否是传统的。我有一个预感,有一个简单的方法来实现这个内置于框架中。
最干净的 Rails-4-ish 方式是什么?如何才能有一个适用于HTML索引视图和CSV视图的局部视图?