csv - 使用 ActiveAdmin 在 Rails 应用程序中导入 CSV 数据

标签 csv ruby-on-rails-3.1 activeadmin

我想通过 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/

相关文章:

linux - 将 ls 输出转换为 csv

ruby-on-rails - 助手 “fields_for”无法正常工作

带 Rails 3.1 的 SSL : config. force_ssl = true 在开发模式下不工作

ruby-on-rails - 在 Active Admin Rails 中自定义按钮和成功消息

vba - 使用 VBA 将 csv 文件导入现有 Access 表

json - 使用 jq(或 awk)将高冗余 CSV 数据转换为嵌套 JSON?

reactjs - D3.csv 未从本地 csv 文件加载数据

ruby-on-rails-3.1 - 为什么 Assets 管道减慢了 Rails 3.1 中的本地主机

ruby-on-rails - ActiveAdmin 和就地编辑

ruby-on-rails - ActiveAdmin 的状态标签颜色