Ruby on rails 在Heroku上移动回形针S3附件
我正在尝试使用Heroku、回形针和S3做一些非常简单的事情——将一个模型的附件设置为与另一个模型的附件相同 下面是我编写的自定义rake任务:Ruby on rails 在Heroku上移动回形针S3附件,ruby-on-rails,ruby-on-rails-3,amazon-s3,heroku,paperclip,Ruby On Rails,Ruby On Rails 3,Amazon S3,Heroku,Paperclip,我正在尝试使用Heroku、回形针和S3做一些非常简单的事情——将一个模型的附件设置为与另一个模型的附件相同 下面是我编写的自定义rake任务: task :migrate => :environment do @companies = Company.where("attachment_file_name IS NOT NULL") @companies.each do |c| if c.attachments.where("attachment_
task :migrate => :environment do
@companies = Company.where("attachment_file_name IS NOT NULL")
@companies.each do |c|
if c.attachments.where("attachment_file_name = ?", c.attachment_file_name).blank?
# i.e. if there are no instances of Attachment that match c.attachment
a = Attachment.new( :company_id => c.id, :name => "Default" )
a.attachment = c.attachment
a.save
end
end
end
所以,我正在尝试将Company.attachment移动到新附件模型的新实例。在我的本地开发服务器上,它工作得很好
一旦被推到Heroku,我将得到以下错误,指向行a.attachment=c.attachment
The specified key does not exist.
我为heroku控制台中有附件的公司手动尝试该操作,得到:
TypeError: can't convert nil into String
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/storage/s3.rb:131:in `extname'
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/storage/s3.rb:131:in `to_file'
/app/.bundle/gems/ruby/1.8/gems/paperclip-2.3.6/lib/paperclip/attachment.rb:81:in `assign'
/app/vendor/plugins/paperclip/lib/paperclip.rb:245:in `attachment='
你知道这是怎么回事吗
我刚刚试过
c.attachment=c.attachment
。同样的错误 看起来像是c.附件文件名
是零,回形针不知道该怎么处理。我不知道为什么它是零,但为了避开它,您可以检查它是否是零,如果是,则跳过它:
if c.attachment_file_name
if c.attachments.where("attachment_file_name = ?", c.attachment_file_name).blank?
# i.e. if there are no instances of Attachment that match c.attachment
a = Attachment.new( :company_id => c.id, :name => "Default" )
a.attachment = c.attachment
a.save
end
end
您是否考虑过修改您的回形针模型以接受URL作为附件?这样,您就可以将附件移植到新型号上,而不必从根本上修改曲别针s3存储机制 将此添加到新模型中:
before_validation :download_remote_attachment, :if => :attachment_url_provided?
然后,要创建一个新的附件对象,将参数传递给它:attachment\u url,它将下载它,重新处理它,并将它存储为新模型的附件。唯一的缺点是附件将在S3上存储两次。根据您的应用程序需求,我认为这可能是一件好事从“为什么它与开发数据库而不是生产数据库一起工作”的角度来看,这里还有一个很长的路要走。是否有机会通过
关系获得附件
?如果连接表中添加了主键,mySQL可能会发生这种奇怪的错误。但将与sqLite3一起使用。因此,一旦进入生产阶段,就会看到错误。只是想一想。谢谢你的主意。我已经检查过文件名是否存在。事实上,在我的手工操作中,我确保了文件已经存在并准备就绪。这个问题是由其他原因引起的。在黑暗中拍摄,但是您是否尝试使用read\u属性
来读取c.attachment
属性。。。像a.attachment=c.read\u属性(:attachment)
?我以前曾在CarrierWave中使用过它来获取图像属性,因为他们在幕后使用它做了一些奇怪的事情,所以可能与CarrierWave的方法相同PaperClip@iWasRobbed-我刚在Heroku控制台中尝试过,但它返回了一个nil
值。你有没有找到解决方案?我知道不应该,但是c.attachment.errors包含什么有趣的内容吗?
attr_accessor :attachment_url
private
def attachment_url_provided?
!self.attachment_url.blank?
end
def download_remote_attachment
self.file = do_download_remote_image
end
def do_download_remote_attachment
io = open(attachment_url)
def io.original_filename; base_uri.path.split('/').last; end
io.original_filename.blank? ? nil : io
rescue
end