Ruby/Rails - Shrine::Error (存储 :store 未在 ImageUploader 上注册)



在过去的几天里,我正在尝试为我的应用程序添加新的存储配置,以便我们可以将Cloudinary用于图像,将Digital Ocean Spaces用于其他文件。 在我认为需要的更改之后,当我尝试访问与 ImageUploader 的附加器关联的旧模型属性时,我收到此错误:

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

问题是:我确实没有定义存储"存储",但那是因为我正在尝试image_storeraw_store

这是我config/initializers/shrine.rb

# 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

这是我的图像上传器:

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

谁能帮我?

好的,我发现了问题。

起初,我曾经在我的 Shrine 初始值设定项中只有 2 个存储:

[...]
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"保存,这与旧商店的云配置不再匹配。

因此,我似乎需要做的是:更新数据库中任何文件列的存储字段,使其与当前配置匹配。

最新更新