Rails - 如何在 Rails 中将嵌套资源导出为 CSV?

Rails - How to export nested resources to CSV in Rails?

我正在尝试将一些数据导出到 Rails 中的 CSV 文件。我有两个模型:游览和铭文。一游多碑,一碑归一游。

我的嵌套路由是这样定义的:

  resources :excursions do
    resources :inscriptions
    get 'exportcsv' => 'excursions#download'
  end

所以我想要实现的行为是:当我访问路线 /excursions/1/exportcsv 时,一个 CSV 文件将被下载到我的电脑上,它将包含所有excursion_id = 1 的 CSV 格式铭文。

在我的游览模型中,我定义了 self.to_csv:

  def self.to_csv(options = {})
    CSV.generate(options) do |csv|
      csv << column_names
      self.inscriptions.each do |inscription|
        csv << inscription.attributes.values_at(*column_names)
      end
    end
  end

还有我的游览控制器方法下载:

  def download
    @excursion = Excursion.find(params[:id])
    respond_to do |format|
      format.html
      format.csv { send_data @excursion.to_csv }
    end
  end

编辑:当我去像这样的路线时:/excursions/:id/exportcsv 服务器抛出 ActiveRecord::RecordNotFound 错误。这个错误很容易解决,但如果我解决了 RecordNotFound,我会在这一行得到一个 ActionController::UnknownFormat:

  def download
    @excursion = Excursion.find(params[:id])
    respond_to do |format|  ########THIS LINE
      format.html
      format.csv { send_data @excursion.to_csv }
    end
  end

我做错了什么?也许所有这些方法都不正确...

我会将路线更新为以下内容:

resources :excursions do
  get 'download', on: :member, constraints: { format: /(html|csv)/ }
  resources :inscriptions
end

您的模型代码中也存在错误。您正在导出 inscriptions 但使用的是 Excursion column_names 而不是 Inscription column_names。以下是更新后的模型代码。

class Excursion < ActiveRecord::Base
  def to_csv(options = {})
    CSV.generate(options) do |csv|
    inscription_column_names = Inscription.column_names

    csv << inscription_column_names

    self.inscriptions.each do |inscription|
      csv << inscription.attributes.values_at(*inscription_column_names)
    end
  end
end

现在尝试访问 http://localhost:3000/excursions/:id/download.csv

用现有的 Excursion 记录 ID 替换 :id。如果您仍然遇到 ActiveRecord::RecordNotFound 错误,那么问题可能是您正在尝试访问数据库中实际上不存在的 Excursion