【问题标题】:Rails 6: CSV is returned at the response payload but not downloadedRails 6:响应负载返回 CSV 但未下载
【发布时间】:2021-09-21 10:45:59
【问题描述】:

我有一个视图允许用户选择要导出到 CSV 文件中的一组记录。

在用户选择一组记录并提交包含信息的表单后,CSV 会正确生成并返回,但不会询问用户将文件保存在哪里,而是没有任何反应。在浏览器上检查请求后,我发现数据以原始 CSV 形式存在于响应负载中。如何让浏览器显示保存对话框?


视图有一个包含记录列表的表单,并且可以选择(使用复选框)导出每条记录。

<%= form_with url: export_to_csv_admin_properties_url, multipart: true do |form| %>
  <table class="table is-striped">
    <thead>
      <tr>
          <th><%= sortable "id" %></th>
          <th><%= sortable "city" %></th>
          <th>To export</th>
      </tr>
    </thead>

    <tbody>
      <% @properties.each do |property| %>
      <tr>
        <td><%= property.id %></td>
        <td> <%= property.city %> </td>
        <td><%= check_box("export", property.id) %></td>
      </tr>
      <% end %>
    </tbody>
  </table>

  <%= form.submit "Export" %>
<% end %>

控制器正确接收数据并调用负责构建CSV字符串的类:

def export_to_csv
  ids_to_export = params[:export].select { |_key, value| value == '1' }.keys
  properties = Property.find(ids_to_export)
  csv_data = CsvService.export_properties(properties)

  send_data csv_data, filename: "exported_properties.csv", type: 'text/csv'
end

【问题讨论】:

  • @dbugger,csv_data 是一个字符串,没有 #read 方法。第二个参数a是什么?
  • 根据文档,如果您使用 send_data 返回要由浏览器下载的文件,您可能需要添加 disposition: 'attachment; filename=exported_properties.csv' 或类似名称。此外,您应该在控制器中执行 send_data,而不是您的班级。从类中返回 CSV 数据并将其发送给控制器中的用户。
  • @JohnP,它会自动使用这些值定义处置。响应头包含Content-Disposition attachment; filename="exported_properties.csv"; filename*=UTF-8''exported_properties.csvsend_data 在控制器上。
  • 那么export_to_csv方法在控制器中? docs 可能是查找有关其工作原理的信息的最佳位置。那里甚至还有一些 CSV 文件的示例代码。但是,更一般地说,如果响应到达浏览器但未显示,则可能是标题的问题 - Rails 没有传递浏览器需要知道如何处理数据的信息,因此您需要确保您可以通过正确调用send_data 来提供它。不过,恐怕我自己也帮不上忙!

标签: ruby-on-rails ruby-on-rails-6


【解决方案1】:

在视图中的from_with方法中添加local: true即可解决问题。

<%= form_with url: export_to_csv_admin_properties_url, local: true do |form| %>

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2021-10-04
    • 2019-09-10
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2012-09-27
    相关资源
    最近更新 更多