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

Jar*_*ryl 67 ruby file-upload ruby-on-rails paperclip

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

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

the*_*eIV 140

你的编程是什么意思?您可以设置一个方法,该方法将沿着行的文件路径

my_model_instance = MyModel.new
file = File.open(file_path)
my_model_instance.attachment = file
file.close
my_model_instance.save!
Run Code Online (Sandbox Code Playgroud)

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

class MyModel < ActiveRecord::Base
  has_attached_file :attachment
end
Run Code Online (Sandbox Code Playgroud)

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

  • `attachment`是你在`has_attached_file:attachment,`中设置的任何东西 (5认同)
  • 请停止传播打开文件并忘记,这在红宝石社区中是如此令人讨厌的事情..open然后.close或使用一个块. (2认同)
  • @clyfe非常欢迎您对该帖子进行编辑.如果你不愿意,你更喜欢两种方法中的哪一种(#close`或block)?另外,讲道有点强,不是吗?但是,你的观点很受欢迎. (2认同)

jon*_*nii 12

我在rake任务中做了类似的事情.

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
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

  • 它将导致“打开的文件太多”错误 (2认同)

小智 8

我实际上不必为此编写方法.更简单.

在模型 - >

Class Model_Name < ActiveRecord::Base
  has_attached_file :my_attachment,
  :params_for_attachment
Run Code Online (Sandbox Code Playgroud)

在seed.db - >

my_instance = Model_name.new
my_instance.my_attachment = File.open('path/to/file/relative/to/app')
my_instance.save!
Run Code Online (Sandbox Code Playgroud)

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