我要做的是使用Sideqik在后台从文件中读取一些数据。我的问题是,当我将UploadedFile从我的控制器传递给worker时,它从UploadedFile变为Hash。
在我的控制器的创建方法中:
file = params[file_key]
if not (file.nil? or file.class == ActionDispatch::Http::UploadedFile)
raise "File not a file in Controller!"
elsif not file.nil?
ImporterWorker.perform_async(name, file)
end
不会引发异常,我们欢迎使用ImporterWorker,它具有:
def perform(name, file)
if not file.class == ActionDispatch::Http::UploadedFile
raise "File is: #{ file.class }:#{ file.inspect }"
end
...
在引发异常的地方,“File is:Hash:”后面跟着一大堆任意的东西,我想象的是文件内容的表示,后跟“'original_filename'=>'Foo.xls'”和其他这样的领域。
为什么它变成哈希?我该怎么做才能解决这个问题?
答案 0 :(得分:3)
在应用程序代码中创建作业有三种方法 ... 这三种方式都创建了一个表示作业的Hash,序列化了这个 散列到JSON字符串并将该字符串推送到Redis中的队列。 这意味着您的worker的参数必须是简单的JSON数据类型 (数字,字符串,布尔值,数组,哈希)。复杂的Ruby对象(例如 日期,时间,ActiveRecord实例)将无法正确序列化。
因此,您需要更永久地存储文件,然后将文件路径传递给作业以进行进一步处理