我有一个使用Carrierwave来处理文件上传的应用程序,但确实喜欢ActiveStorage的简单性。在以前的日落开发中,有很多关于从Paperclip迁移到ActiveStorage的教程,但是从Carrierwave迁移到ActiveStorage方面我看不到任何东西。有没有人成功完成了迁移,并且可以指出正确的方向?
答案 0 :(得分:4)
过程实际上非常简单。
配置活动存储区。尝试使用与载波不同的存储桶
配置模型以提供对ActiveStorage的访问。例子
class Photo < AR::Base
mount_uploader :file, FileUploader # this is the current carrierwave implementation. Don't remove it
has_one_attached :file_new # this will be your new file
end
现在,您将有两个针对同一模型的实现。 file
处的载波访问和file_new
处的ActiveStorage
从Carrierwave下载图像并将其保存到活动存储中 可以在rake文件,activeJob等中实现。
Photo.find_each do |photo|
begin
filename = File.basename(URI.parse(photo.fileurl))
photo.file_new.attach(io: open(photo.file.url), filename: d.file )
rescue => e
## log/handle your errors in order to retry later
end
end
这时,您在载波存储桶上将有一张图像,而在活动存储桶上将有新创建的图像!
一旦准备好进行迁移,请修改模型,更改活动存储访问器并删除载波集成
class Photo < AR::Base
has_one_attached :file # we changed the atachment name from file_new to file
end
这是一个方便的选项,因此您在控制器和其他地方的集成仍保持不变。希望如此!
更新active_storage_attachments
表上的记录,以便找到附件为file
,而不是file_new
将列name
从“ file_new”更新为“ file” >
为了处理需要考虑的事情,可以对应用程序进行其他一些调整
在助手中是这样的:
photo.attached? ? url_for(photo.file_new) : photo.file.url
我希望这会有所帮助!
答案 1 :(得分:2)
开始
bundle exec rails active_storage:install
rails db:migrate
mount_uploader :image, ImageUploader
,使其看起来像has_one_attached :image
。image_url
替换为url_for(user.image)
。您不必对控制器代码或参数进行任何更改,因为属性image
已经是 strong 参数。
# user.rb
class User < ApplicationRecord
# mount_uploader :image, ImageUploader
has_one_attached :image
end
# show.html.erb
<%= image_tag url_for(user.image) %>
or
<%= image_tag user.image %>
答案 2 :(得分:0)
嗯,您是否检查了博客“ Moving from CarrierWave to ActiveStorage in a Rails app”中的详细说明