Ruby on rails 将Carrierwave迁移到ActiveStorage
我有一个使用Carrierwave处理文件上传的应用程序,但我非常喜欢ActiveStorage的简单性。在sunsetting之前的开发中,有很多关于从曲别针迁移到ActiveStorage的教程,但我没有看到任何关于从Carrierwave迁移到ActiveStorage的教程。是否有人成功地完成了迁移,并能为我指出正确的方向 首先Ruby on rails 将Carrierwave迁移到ActiveStorage,ruby-on-rails,carrierwave,rails-migrations,rails-activestorage,Ruby On Rails,Carrierwave,Rails Migrations,Rails Activestorage,我有一个使用Carrierwave处理文件上传的应用程序,但我非常喜欢ActiveStorage的简单性。在sunsetting之前的开发中,有很多关于从曲别针迁移到ActiveStorage的教程,但我没有看到任何关于从Carrierwave迁移到ActiveStorage的教程。是否有人成功地完成了迁移,并能为我指出正确的方向 首先 您必须运行此bundle exec rails active\u存储:安装 railsdb:migrate 更换型号中的装载上传器:图像,图像上传器,使其看起来
bundle exec rails active\u存储:安装
railsdb:migrate
装载上传器:图像,图像上传器
,使其看起来像附加了一个:图像
image\u url
替换为url\u
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 %>
#user.rb
类用户<应用程序记录
#挂载上传器:图像,图像上传器
是否附加了一张图片
结束
#show.html.erb
或
这个过程实际上很简单
步骤1:
配置活动存储桶。试着用一个不同于你的桶的桶
步骤2:
配置您的模型以提供对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
此时,您将在carrierwave存储桶上有一个映像,在活动存储桶上有新创建的映像
(可选)
步骤4
准备好迁移后,请修改您的模型,更改活动存储存取器并删除carrierwave集成
class Photo < AR::Base
has_one_attached :file # we changed the atachment name from file_new to file
end
class-Photo
这是一个方便的选项,因此您在控制器和其他位置的集成保持不变。但愿如此
步骤5
更新active\u storage\u attachments
表中的记录,以便将附件作为file
而不是file\u new
更新列name
从“file\u new”改为“file”
笔记
可以对应用程序进行一些其他调整,以处理需要考虑的问题
- 如果您的站点将在迁移过程中运行,则完全运行的一种方法是为新上载实施活动存储,然后当您显示图像时,可以显示活动存储和carrierwave作为备用
photo.attached?url(photo.file\u新建):photo.file.url
我希望这有帮助 谢谢你的回复。对于我已经完成的初始设置来说,这肯定很有用,但我希望将现有记录从Carrierwave迁移到ActiveStorage。您是否将图像存储在云服务上,比如s3?digital ocean?实际上,它使用的是s3 sdk。rake任务比我开始编写的要简单得多,谢谢。我将对此进行一次尝试,并让您知道它是如何进行的。建议的rake任务有问题。按原样运行它会给我以下错误消息:(坏URI(不是URI?):**/***/***.jpg),尽管我知道图像在那里。事实上,如果我在浏览器中打开指定的链接,它会让我选择下载它。我修改了代码,在解析之前先对uri进行编码,然后收到#的“undefined method”gsub,但是在上传程序中没有使用gsub。
def store_dir
if Rails.env.development?
“development/#{model.class.to#s.下划线}/{model.slug.to##{model.class.to_s.下划线}/#{model.slug.to_s}”
end
end
我是个业余爱好者,对第3步不太清楚。我该如何运行它?rake文件和ActiveJobs超出我的知识范围。好的,指南很好。我运行了bin/rails生成作业副本载体Wave to activestorage
。我想我可以使用你的照片。找到…
,但对我来说并不明显e我把它放在哪个文件中,也不知道我这样做后如何运行。这些文件是app/jobs/copy\u carrierwave\u to\u activestorage\u job.rb
和spec/jobs/copy\u carrierwave\u to\u activestorage\u job\u spec.rb
和app/jobs/application\u job.rb
。我很欣赏这篇文章,在迁移过程中没有看到任何其他内容。你真的尝试过吗您的代码?我的步骤3中的attach()行相当于您的步骤#3photo.file\u new.attach()
崩溃:NoMethodError(未定义的方法'upload'for nil:NilClass)
。blob未签名似乎有问题?如果任何人有可行的解决方案,请与我们分享。
class Photo < AR::Base
has_one_attached :file # we changed the atachment name from file_new to file
end