Ruby on rails 将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 更换型号中的装载上传器:图像,图像上传器,使其看起来

我有一个使用Carrierwave处理文件上传的应用程序,但我非常喜欢ActiveStorage的简单性。在sunsetting之前的开发中,有很多关于从曲别针迁移到ActiveStorage的教程,但我没有看到任何关于从Carrierwave迁移到ActiveStorage的教程。是否有人成功地完成了迁移,并能为我指出正确的方向

首先

  • 您必须运行此
    bundle exec rails active\u存储:安装
  • railsdb:migrate
  • 更换型号中的
    装载上传器:图像,图像上传器
    ,使其看起来像
    附加了一个:图像
  • 要在视图中呈现图像,应将(user.image)
    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()行相当于您的步骤#3
    photo.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