gpt4 book ai didi

ruby-on-rails - 事件存储 - 多项服务 - 直接上传未按预期工作

转载 作者:行者123 更新时间:2023-12-05 05:54:00 27 4
gpt4 key购买 nike

我在 storage.yml

中定义了两个服务
amazon:
service: S3
bucket: bucket1
region: eu-central-1
access_key_id: 321
secret_access_key: 321

unsafe_files:
service: S3
bucket: unsafe-files
region: eu-central-1
access_key_id: 123
secret_access_key: 123

我对一些文件使用 amazon 服务,我想对其他文件使用 unsafe_files 服务,这样我就可以将它们放入另一个 s3 存储桶中。

使用 unsafe_files 服务的模型看起来像这样(非常简单):

class Customer < ActiveRecord::Base
belongs_to :customer_image
end
class CustomerImage < Image
has_one_attached :file, service: Rails.configuration.settings[:unsafe_files_service]
end

Rails.configuration.settings[:unsafe_files_service] 只是 unsafe_files

在 rails application.rb 我正在设置

config.active_storage.service = :amazon 这样默认情况下它使用 storage.yml

中定义的 amazon 服务

现在我想直接使用form_with上传文件,也很简单:

<%= form_with model: [@customer, CustomerImage.new] do |form| %>
<%=
form.file_field :file,
accept: 'image/jpeg',
direct_upload: true,
multipart: true
%>
<%= form.submit "submit" %>
<% end %>

现在我知道(或者我想我知道)在使用 active_storage 时,直接上传在 rails 中是如何工作的。一些 javascript 监听表单提交事件,首先获取 file_field 中的内容,并将其发送到检查图像的 DirectUploadsController,生成直接上传 url,然后我们直接将文件上传到指定的服务。都在这里:https://github.com/rails/rails/blob/6ecf1065da57360bdc9f1d85e2c2d9314dcb79e0/activestorage/app/controllers/active_storage/direct_uploads_controller.rb#L14

服务以文件 key 或 ID 响应。之后表单提交继续,我们保存我们收到的 id,这就是文件之间的关系。

但是当我们点击 DirectUploadsController 并创建 blob 时,它会获得默认的 service_name(参见:https://github.com/rails/rails/blob/6ecf1065da57360bdc9f1d85e2c2d9314dcb79e0/activestorage/app/models/active_storage/blob.rb#L115)

长话短说,当使用直接上传时,我无法选择服务,我必须依赖 rails 默认服务。

有解决办法吗?或者我错过了什么?

最佳答案

这是一个已知问题。这PR是针对该问题的,但由于另一个主题而被还原。

我解决此问题的方法是覆盖 DirectUploadsController 中的 blob_args 方法。

# app/overrides/direct_uploads_controller_override.rb
ActiveStorage::DirectUploadsController.class_eval do
alias_method :old_blob_args, :blob_args
def blob_args
old_blob_args.merge(service_name: params[:service])
end
end

加载覆盖:

# config/application.rb
# ...
overrides = "#{Rails.root}/app/overrides"
Rails.autoloaders.main.ignore(overrides)

config.to_prepare do
Dir.glob("#{overrides}/**/*_override.rb").each do |override|
load override
end
end

不使用 direct_upload 选项,而是手动设置数据属性 data-direct-upload-url。例如:

<%= form.file_field :file, multipart: true, 
"data-direct-upload-url" => rails_direct_uploads_url(service: "unsafe_files") %>

关于ruby-on-rails - 事件存储 - 多项服务 - 直接上传未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69769179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com