如何获取存储在 rails 控制器的活动存储中的has_one模型附件的 url。因此,我将能够将其作为 json 中的 api 的完整链接发送。 到目前为止,我已经尝试了以下方法,但每种方法都给出了各种问题:
-
service_url
current_user.image.service_url
---- #<ActiveStorage::Attached::One:0x....> -
Rails.application.routes.url_helpers.rails_disk_blob_path(current_user.image, only_path: true)
,它给了我一个输出,如下所示:"/rails/blobs/%23%3CActiveStorage::Attached::One:0x007f991c7b41b8%3E">
但这不是网址,对吧?我无法在浏览器上点击并获取图像。
-
url_for
----#<Api::V1::UsersController:0x007f991c1eaa98>
将方法rails_blob_path
用于控制器和模型中的附件
例如,如果您需要分配一个变量(例如cover_url
( 在控制器中,首先应包含url_helpers
和使用后的方法rails_blob_path
以及一些参数。您可以在任何模型、工人等中执行相同的操作。
完整示例如下:
class ApplicationController < ActionController::Base
include Rails.application.routes.url_helpers
def index
@event = Event.first
cover_url = rails_blob_path(@event.cover, disposition: "attachment", only_path: true)
end
end
有时,例如,API 需要返回客户端(例如手机等(的完整 url 和主机/协议。在这种情况下,将 host 参数传递给所有rails_blob_url调用是重复的,而不是 DRY。甚至,您可能需要在开发/测试/生产中设置不同的设置才能使其正常工作。
如果您使用的是 ActionMailer 并且已经在环境中配置了该主机/协议/*.rb,则可以在rails_blob_url
或rails_representation_url
中重复使用该设置。
# in your config/environments/*.rb you might be already configuring ActionMailer
config.action_mailer.default_url_options = { host: 'www.my-site.com', protocol: 'https' }
我建议只调用完整的Rails.application.url_helpers.rails_blob_url
,而不是将至少 50 个方法转储到您的模型类中(取决于您的 routes.rb(,当您只需要 2 个方法时。
class MyModel < ApplicationModel
has_one_attached :logo
# linking to a variant full url
def logo_medium_variant_url
variant = logo.variant(resize: "1600x200>")
Rails.application.routes.url_helpers.rails_representation_url(
variant,
Rails.application.config.action_mailer.default_url_options
)
end
# linking to a original blob full url
def logo_blob_url
Rails.application.routes.url_helpers.rails_blob_url(
logo.blob,
Rails.application.config.action_mailer.default_url_options
)
end
end
我没有使用rails活动存储,但我在文档中读到的内容可能会对您有所帮助
试试rails_blob_url(model.image)
更多 http://edgeguides.rubyonrails.org/active_storage_overview.html
我能够使用以下方法在浏览器中查看图像:
<%= link_to image_tag(upload.variant(resize: "100x100")), upload %>
其中upload
是附加的图像。