我想通过 activeadmin 面板上传 CSV 文件。
在资源“产品”的索引页面上,我想要一个带有“导入 csv 文件”的“新产品”按钮旁边的按钮。
我不知道从哪里开始。
在文档中是关于 collection_action 的,但是在下面的代码中,我在顶部没有链接。
ActiveAdmin.register Post do
collection_action :import_csv, :method => :post do
# Do some CSV importing work here...
redirect_to :action => :index, :notice => "CSV imported successfully!"
end
end
这里有人使用 activeadmin 并且可以导入 csv 数据吗?
最佳答案
接续 托马斯·屈臣氏 答案的良好开端,它帮助我在弄清楚其余部分之前了解自己的方向。
代码打击不仅允许示例 Posts 模型的 CSV 上传,还允许此后的任何后续模型。您需要做的就是将示例中的 action_item 和 collection_actions 复制到任何其他 ActiveAdmin.register 块中,功能将相同。希望这可以帮助。
app/admin/posts.rb
ActiveAdmin.register Post do
action_item :only => :index do
link_to 'Upload CSV', :action => 'upload_csv'
end
collection_action :upload_csv do
render "admin/csv/upload_csv"
end
collection_action :import_csv, :method => :post do
CsvDb.convert_save("post", params[:dump][:file])
redirect_to :action => :index, :notice => "CSV imported successfully!"
end
end
应用程序/模型/csv_db.rb
require 'csv'
class CsvDb
class << self
def convert_save(model_name, csv_data)
csv_file = csv_data.read
CSV.parse(csv_file) do |row|
target_model = model_name.classify.constantize
new_object = target_model.new
column_iterator = -1
target_model.column_names.each do |key|
column_iterator += 1
unless key == "ID"
value = row[column_iterator]
new_object.send "#{key}=", value
end
end
new_object.save
end
end
end
end
注意:此示例检查第一列是否为 ID 列,然后跳过该列,因为 rails 将为新对象分配 ID(请参阅下面的示例 CSV 以供引用)
app/views/admin/csv/upload_csv.html.haml
= form_for :dump, :url=>{:action=>"import_csv"}, :html => { :multipart => true } do |f|
%table
%tr
%td
%label{:for => "dump_file"}
Select a CSV File :
%td
= f.file_field :file
%tr
%td
= submit_tag 'Submit'
app/public/example.csv
"1","TITLE EXAMPLE","MESSAGE EXAMPLE","POSTED AT DATETIME"
"2","TITLE EXAMPLE","MESSAGE EXAMPLE","POSTED AT DATETIME"
"3","TITLE EXAMPLE","MESSAGE EXAMPLE","POSTED AT DATETIME"
"4","TITLE EXAMPLE","MESSAGE EXAMPLE","POSTED AT DATETIME"
"5","TITLE EXAMPLE","MESSAGE EXAMPLE","POSTED AT DATETIME"
注意:并非总是需要引用
关于csv - 使用 ActiveAdmin 在 Rails 应用程序中导入 CSV 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754896/