Rails 4 CSV生成没有代码重复的索引视图

时间:2015-11-12 01:02:47

标签: ruby-on-rails csv ruby-on-rails-4 dry code-duplication

如何将我的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视图的局部视图?

0 个答案:

没有答案