未定义的方法`path'通过sidekiq导入csv

时间:2015-09-28 08:17:42

标签: ruby-on-rails csv sidekiq

我正在尝试通过sidekiq导入一个大型csv。但我面临着问题。

我在我的控制器中编写了import方法。

  def import
   Importcsv.perform_async(params[:file])
   redirect_to calendars_path, notice: "Calendar imported."
  end

工人代码在这里。

class Importcsv
  include Sidekiq::Worker
  sidekiq_options queue: "high"

 def perform(file)
   CSV.foreach(file.path, headers: true) do |row|
   calendar = find_by_id(row['id']) || new
     calendar.attributes = row.to_hash
     calendar.save
   end
 end
end

但我收到此错误undefined method路径' for" / tmp / RackMultipart20150928-8812-sgwsm5":String`

2 个答案:

答案 0 :(得分:1)

您的错误日志表明,您正试图从path的实例获取String。您可以尝试以下代码:

def perform(file)
  file = file.path if file.is_a?(File)
  CSV.foreach(file, headers: true) do |row|
    # ...
  end
end

这样,您可以在此方法中接受StringFile参数。另请注意,在使用Sidekiq时,您无法将File作为参数传递。请详细了解here

答案 1 :(得分:0)

我通过传递单行解决了这个问题,例如

CSV.foreach(params[:file].path, headers: true) do |row|
  attrs ={name: row[0]} 
  Importcsv.perform_async(attrs)
end