如何获取存储在 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_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
,而不是在您只需要 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 6 中的 bin/rails 路由中省略操作邮箱、活动存储和导体路由?