首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby/Rails - Shrine::Error (storage :store没有在ImageUploader上注册)

Ruby/Rails - Shrine::Error (storage :store没有在ImageUploader上注册)
EN

Stack Overflow用户
提问于 2020-05-26 06:29:08
回答 1查看 171关注 0票数 1

在过去的几天里,我试图为我的应用程序添加一个新的存储配置,这样我们就可以使用Cloudinary来存储图像,使用Digital Ocean Spaces来存储其他文件。在进行了我认为需要的更改之后,当我尝试访问与ImageUploader的Attacher关联的旧模型的属性时,我得到了这个错误:

Shrine::Error (storage :store isn't registered on ImageUploader)

问题是:我没有定义一个存储“存储”,但那是因为我想要有一个image_store和一个raw_store

这是我的config/initializers/shrine.rb

代码语言:javascript
复制
# config/initializers/shrine.rb
require "shrine"
require "shrine/storage/file_system"
require "shrine/storage/cloudinary"
require "shrine/storage/s3"

Shrine.plugin :activerecord
Shrine.plugin :cached_attachment_data # for retaining the cached file across form redisplays
Shrine.plugin :restore_cached_data # re-extract metadata when attaching a cached file
Shrine.plugin :rack_file # for non-Rails apps
Shrine.plugin :default_storage, store: :image_store

s3_options = {
  access_key_id: ENV['DO_SPACE_ACCESS_KEY_ID'],
  secret_access_key: ENV['DO_SPACE_SECRET_ACCESS_KEY'],
  bucket: ENV['DO_SPACE_SECRET_BUCKET'],
  endpoint: "https://#{ENV['REGION']}.digitaloceanspaces.com",
  region: ENV['REGION']
}

if Rails.env.development? || Rails.env.test?
  Shrine.storages = {
    raw_cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/raw_cache"), # temporary
    raw_store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/raw_store"),       # permanent
    image_cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/image_cache"), # temporary
    image_store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/image_store")       # permanent
  }
else
  Shrine.storages = {
    raw_cache: Shrine::Storage::S3.new(
      prefix: "raw_cache", upload_options: { acl: 'public-read' }, **s3_options
    ), # for direct uploads
    raw_store: Shrine::Storage::S3.new(
      prefix: "raw_store", upload_options: { acl: 'public-read' }, **s3_options
    ),
    image_cache: Shrine::Storage::Cloudinary.new(prefix: "image_cache", resource_type: 'image'), # for direct uploads
    image_store: Shrine::Storage::Cloudinary.new(prefix: "image_store", resource_type: 'image'),
  }
end

下面是我的ImageUploader:

代码语言:javascript
复制
class ImageUploader < Shrine
  plugin :default_storage, cache: :image_cache, store: :image_store
  plugin :validation_helpers
  plugin :data_uri
  plugin :infer_extension

  plugin :upload_options, store: ->(io, context) do
    [...]
  end

  plugin :url_options, store: -> (io, **options) do
    [...]
  end

  # I even tried that one, but no success
  Attacher.default_store :image_store

  Attacher.validate do
    validate_max_size 5*1024*1024, message: "is too large (max is 5 MB)"
  end
end

有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-29 06:14:39

好了,我找到问题了。

一开始,我的神殿初始化器中只有2个存储空间:

代码语言:javascript
复制
[...]
Shrine.storages = {
  cache: Shrine::Storage::Cloudinary.new(prefix: "image_cache", resource_type: 'image'), # for direct uploads
  store: Shrine::Storage::Cloudinary.new(prefix: "image_store", resource_type: 'image'),
  }
[...]

出于这个原因,现在我正在更新我的存储,当我恢复之前保存的记录时,它在附件字段中使用"storage: store“保存,这与旧存储的cloudinary配置不再匹配。

所以,看起来我需要做的是:更新数据库中任何文件列的存储字段,这样它就会匹配当前的配置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62011748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档