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
。
我正在尝试将一些数据导出到 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
。