将载波迁移到ActiveStorage

时间:2018-09-27 02:41:47

标签: ruby-on-rails carrierwave rails-migrations rails-activestorage

我有一个使用Carrierwave来处理文件上传的应用程序,但确实喜欢ActiveStorage的简单性。在以前的日落开发中,有很多关于从Paperclip迁移到ActiveStorage的教程,但是从Carrierwave迁移到ActiveStorage方面我看不到任何东西。有没有人成功完成了迁移,并且可以指出正确的方向?

3 个答案:

答案 0 :(得分:4)

过程实际上非常简单。

步骤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

现在,您将有两个针对同一模型的实现。 file处的载波访问和file_new处的ActiveStorage

步骤3:

从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

这时,您在载波存储桶上将有一张图像,而在活动存储桶上将有新创建的图像!

(可选)

步骤4

一旦准备好进行迁移,请修改模型,更改活动存储访问器并删除载波集成

 class Photo < AR::Base
   has_one_attached :file # we changed the atachment name from file_new to file 
 end

这是一个方便的选项,因此您在控制器和其他地方的集成仍保持不变。希望如此!

步骤5

更新active_storage_attachments表上的记录,以便找到附件为file,而不是file_new将列name从“ file_new”更新为“ file”

笔记

为了处理需要考虑的事情,可以对应用程序进行其他一些调整

  • 如果您的网站在迁移过程中将运行,则完全操作的一种方法是为新上传的内容实现活动存储,然后在显示图像时,您可以显示活动存储和载波作为后备

在助手中是这样的:

photo.attached? ? url_for(photo.file_new) : photo.file.url

我希望这会有所帮助!

答案 1 :(得分:2)

开始

  1. 您必须运行此bundle exec rails active_storage:install
  2. rails db:migrate
  3. 在模型中替换mount_uploader :image, ImageUploader,使其看起来像has_one_attached :image
  4. 要在视图中呈现图像,应将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”中的详细说明