Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Heroku上移动回形针S3附件_Ruby On Rails_Ruby On Rails 3_Amazon S3_Heroku_Paperclip - Fatal编程技术网

Ruby on rails 在Heroku上移动回形针S3附件

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_

我正在尝试使用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_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