我如何获取附件的URL存储在Rails控制器的活动存储中

Mob*_*een 5 ruby ruby-on-rails rails-api rails-activestorage ruby-on-rails-5.2

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

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"
Run Code Online (Sandbox Code Playgroud)

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

3)url_for ----

undefined method `active_storage_attachment_url' for #<Api::V1::UsersController:0x007f991c1eaa98
Run Code Online (Sandbox Code Playgroud)

Jon*_*ado 10

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
Run Code Online (Sandbox Code Playgroud)

  • `rails_blob_path` 不接受变体。我在 Rails 5.2 中使用了 `rails_representation_url(variant_or_blob, disposition: "attachment", only_path: true)` ,它似乎接受常规 blob 或变体。 (3认同)

stw*_*ert 7

有时,例如,API 需要为客户端(例如手机等)返回带有主机/协议的完整 url。在这种情况下,将主机参数传递给所有 rails_blob_url 调用是重复的而不是 DRY 的。甚至,您可能需要在 dev/test/prod 中进行不同的设置才能使其工作。

如果您正在使用 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' }
Run Code Online (Sandbox Code Playgroud)

Rails.application.url_helpers.rails_blob_url当您只需要 2 个时,我建议只调用完整的方法,而不是将至少 50 个方法转储到您的模型类中(取决于您的 routes.rb)。

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

Run Code Online (Sandbox Code Playgroud)