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

How can I get url of my attachment stored in active storage in my rails controller

如何将我的 has_one 模型附件的 url 存储在我的 rails 控制器的活动存储器中。因此,我将能够像 json 中的 api 一样完整地发送它 link。 到目前为止,我已经尝试了以下方法,但每种方法都存在各种问题:

  1. current_user.image.service_url ---- # 的未定义方法“service_url”

  2. Rails.application.routes.url_helpers.rails_disk_blob_path(current_user.image, only_path: true),它给我这样的输出:

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

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

  1. url_for ----

    # 的未定义方法“active_storage_attachment_url”

我没有使用过 rails 活动存储,但我在文档中阅读的内容可能对您有所帮助

尝试rails_blob_url(model.image)

更多http://edgeguides.rubyonrails.org/active_storage_overview.html

我可以使用以下方法在浏览器中查看图像:

<%= link_to image_tag(upload.variant(resize: "100x100")), upload %>

其中 upload 是附加图片。

对控制器和模型中的附件使用方法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 需要 return 完整的 url 以及客户端的主机/协议(例如手机等)。在这种情况下,将主机参数传递给所有 rails_blob_url 调用是重复的,而不是 DRY。甚至,您可能需要在 dev/test/prod 中进行不同的设置才能使其正常工作。

如果您正在使用 ActionMailer 并且已经在 environments/*.rb 中配置了 host/protocol,您可以通过 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 个方法转储到您的模型 class(取决于您的 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