我遇到的问题只影响其生产环境中的此应用程序。我们有一个控制器动作,用于通过创建新对象来“克隆”文章对象,将属性设置为彼此相等,然后将图像添加到对象。
以下是控制器正在执行此操作的部分:
def clone_article
ba = BlogArticle.find(params[:id])
new_ba = BlogArticle.new(ba.attributes)
ba.blog_article_images.each do |blog_img|
new_ba.blog_article_images.build(:image => blog_img.image.to_file, :embedded => blog_img.embedded?)
end
new_ba.status = 'draft'
new_ba.title = "Copy of #{ba.title}"
if new_ba.save
flash[:notice] = "Clone successful"
else
if new_ba.errors.empty?
flash[:notice] = "Unknown error occurred while cloning the post"
else
error = 'Problem while cloning the post: <br>'
new_ba.errors.each {|field, msg| error += field + " " + msg + "<br>"}
flash[:error] = error
end
end
redirect_to admin_blog_articles_url
端
问题是,当引用服务器上的本地文件时,此脚本可以正常工作。但是在生产环境中,在S3上有图像,我们无法从原始帖子图像中获取任何图像。我认为这可能是一个时间问题,比如控制器在完成整个过程之前没有等待回形针完成将文件加载到app目录中,但我似乎无法得到任何工作。此外,我不是铁路专家,所以我有点失落。
由于
答案 0 :(得分:2)
我遇到了Tempfile
文件名受到严重破坏的问题,并最终得到了这种有点破解的解决方案:
ba.blog_article_images.each do |blog_img|
new_img = blog_img.image.to_file
new_img.instance_variable_set("@original_filename", blog_img.image.original_filename)
def new_img.original_filename
@original_filename
end
new_ba.blog_article_images.build(:image => new_img, :embedded => blog_img.embedded?)
end
它确实有效。 original_filename
是Paperclip添加到File
的方法,我们只是在这里覆盖它。
我没有使用本地存储进行测试,但是通过阅读Paperclip源,它应该可以正常工作。
答案 1 :(得分:1)
我正在做类似的事情。我发现只需要执行object_2.file = object_1.file,然后保存object_2就可以了。大多。 S3转移工作很花哨,但文件名因某些未知原因而受到严重破坏。
答案 2 :(得分:1)
文件被破坏,因为来自object_1的文件从S3向下复制并存储为TempFile,后者使用原始文件名在结尾处的开头和扩展名处创建自己的文件名。我也在研究同样的问题,并感谢在保存object_2之前如何更改TempFile名称的任何想法。