如何使用Paperclip以编程方式设置文件上传


68

我有一个rake任务,使用faker宝石为随机数据播种应用程序。但是,我们还有一些要在此rake任务中上传的图像(如徽标)。

我们已经设置了Paperclip,但没有办法在rake任务中以编程方式将其上传。有任何想法吗?

Answers:


144

您以编程方式是什么意思?您可以设置一个方法,该方法将沿着

my_model_instance = MyModel.new
file = File.open(file_path)
my_model_instance.attachment = file
file.close
my_model_instance.save!

#attachment来自我们模型中的Paperclip声明。在这种情况下,我们的模型看起来像

class MyModel < ActiveRecord::Base
  has_attached_file :attachment
end

引导项目时,我们已经做了类似的事情。


5
attachment是您设定的has_attached_file :attachment,
B 2012年

1
@BSeven您认为如果将其添加到答案中会更清楚吗?如果是这样,我将其添加。
theIV 2012年

是。尚不清楚attachment是保留字还是用户定义的。
七B

2
请停止宣讲打开的文件,然后忘记,这在ruby社区是一件令人讨厌的事情。.open然后.close或使用块。
clyfe

2
@clyfe非常欢迎您对该帖子进行编辑。如果不愿意,#close则您更喜欢这两种方法(或块)中的哪一种?而且,讲道有点强大,不是吗?但是,您的观点很受好评。
theIV 2013年

12

我在耙任务中做这样的事情。

photo_path = './test/fixtures/files/*.jpg'
Dir.glob(photo_path).entries.each do |e|
  model = Model.find(<query here>)        
  model.attachment = File.open(e)
  model.save
end

我希望这有帮助!


这很有用,但是我想我们并没有完全做到这一点,谢谢!
贾里尔

8

我实际上不必为此编写方法。简单得多。

在模型中->

Class Model_Name < ActiveRecord::Base
  has_attached_file :my_attachment,
  :params_for_attachment

在seed.db中->

my_instance = Model_name.new
my_instance.my_attachment = File.open('path/to/file/relative/to/app')
my_instance.save!

也许先前的答案是使用模型中定义的附件名称(而不是编写方法Model_name.attachment)。希望这很清楚。


或成一行my_instance = Model_name.create!(my_attachment: File.open('path/to/file/relative/to/app'))
scarver2 2014年

出于某种原因,fyi我无法使多线工作,但是scarver2的一个工作了一种享受
Ben
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.