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

Posted

技术标签:

【中文标题】如何获取存储在 Rails 控制器的活动存储中的附件的 url【英文标题】:How can I get url of my attachment stored in active storage in my rails controller 【发布时间】:2018-10-29 15:48:08 【问题描述】:

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

    current_user.image.service_url ---- #<:attached::one:0x....>

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

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

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

    url_for----

    #<:v1::userscontroller:0x007f991c1eaa98> 的未定义方法 `active_storage_attachment_url'

【问题讨论】:

为了更清楚,我想在api的json响应中发送图像链接,以便我可以在移动应用程序上显示它 你能打印完整的错误信息吗:> 1) current_user.image.service_url ---- undefined method `service_url' for # 【参考方案1】:

使用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

【讨论】:

rails_blob_path 不接受变体。我在 Rails 5.2 中使用了 rails_representation_url(variant_or_blob, disposition: "attachment", only_path: true),它似乎既可以接受常规 blob,也可以接受变体。【参考方案2】:

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

如果您正在使用 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,而不是在您只需要 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

【讨论】:

【参考方案3】:

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

试试rails_blob_url(model.image)

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

【讨论】:

这个方法同样不可​​用。 rails_disk_blob_url 生成链接,但它是一个奇怪的链接,并且导航到该链接也会出现以下错误:(nil:NilClass 的未定义方法“已验证”):activestorage (0.1) lib/active_storage/verified_key_with_expiration .rb:10 我建议您阅读文档,因为您实施它的方式可能存在一些问题,还要检查您是否有图像附加到该用户 谢谢,一定会在新项目上尝试一下,如果发现什么,请回到这个帖子【参考方案4】:

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

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

upload 是附加图片。

【讨论】:

我想在api中使用

以上是关于如何获取存储在 Rails 控制器的活动存储中的附件的 url的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 5.2 中禁用活动存储

从 Rails 6 中的 bin/rails 路由中省略操作邮箱、活动存储和导体路由?

Rails,js变量的全局存储

如何获取 Rails 应用程序的 CORS 标头以访问 aws s3 存储桶?

未上传用户头像的图像(活动存储)

如何从存储在数据库中的 Listview 获取值到另一个活动?使用 Android 和 Mysql