如何获取存储在 rails 控制器的活动存储中的附件 url



如何获取存储在 rails 控制器的活动存储中的has_one模型附件的 url。因此,我将能够将其作为 json 中的 api 的完整链接发送。 到目前为止,我已经尝试了以下方法,但每种方法都给出了各种问题:

  1. service_urlcurrent_user.image.service_url---- #<ActiveStorage::Attached::One:0x....>

  2. Rails.application.routes.url_helpers.rails_disk_blob_path(current_user.image, only_path: true),它给了我一个输出,如下所示:

    "/rails/blobs/%23%3CActiveStorage::Attached::One:0x007f991c7b41b8%3E">

但这不是网址,对吧?我无法在浏览器上点击并获取图像。

  1. 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_urlrails_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是附加的图像。

相关内容

  • 没有找到相关文章

最新更新