25

是否可以获得回形针附件的绝对 URI?现在,问题是生产环境部署在子 URI 中(Passenger: 上RackBaseURI),但<paperclip attachment>.url返回 Rails-app 相对 URI(/system/images/...)。有没有办法获取回形针附件的绝对 URI?

我正在使用 Paperclip v2.7 和 Rails 3.2.8。

4

7 回答 7

41
asset_url(model.attachment_name.url(:style))

相关的github问题

于 2014-08-08T20:40:18.270 回答
28

尝试

URI.join(request.url, @model.attachment_name.url)

或者

URI(request.url) + @model.attachment_name.url

如果您使用 S3 或绝对 url,它是安全的。

更新:这个答案比我的好;)https://stackoverflow.com/a/21027839/683157

于 2013-01-21T19:24:47.267 回答
20

根据这个github issue,它使用起来更干净,ActionController::Base.asset_host所以它会产生助手:

  def add_host_prefix(url)
    URI.join(ActionController::Base.asset_host, url)
  end

这假设您在每个/config/environments/<environment>.rb文件中都有以下内容:

Appname::Application.configure do

  # ....

  config.action_controller.asset_host = 'http://localhost:3000' # Locally

  # ....

end
于 2014-01-09T18:05:54.310 回答
6

最广泛适用的方法是首先在相关的配置/环境文件中定义您的资产主机:

config.action_controller.asset_host = "http://assethost.com"
config.action_mailer.asset_host = "http://assethost.com"

然后在视图和邮件中:

asset_url(model.attachment.url(:style))

在控制台中:

helper.asset_url(model.attachment.url(:style))

在模型中:

ApplicationController.helpers.asset_url(model.attachment.url(:style))
于 2014-12-03T21:00:26.597 回答
5

你可以这样做:

<%= image_tag "#{request.protocol}#{request.host_with_port}#{@model.attachment_name.url(:attachment_style)}" %>

或者制作一个辅助方法来包装它。

def absolute_attachment_url(attachment_name, attachment_style = :original)
  "#{request.protocol}#{request.host_with_port}#{attachment_name.url(attachment_style)}"
end

并像这样使用它:

<%= image_tag absolute_attachment_url(attachment_name, :attachment_style)}" %>

例如:模型 = 人 (@person),附件名称 = 头像,样式 = :thumb

<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>
于 2012-09-23T21:19:33.007 回答
4

这并不能完全解决原始海报的问题(它在视图中运行,而不是在模型中运行),但对于试图在视图中“获取回形针附件的绝对 URL”的人可能会有所帮助:以同样的方式

image_tag(user.avatar.url(:large))

将图像本身置于您的视野中,

image_url(user.avatar.url(:large))

link_to如果您想直接链接到资产(例如在调用中),则只返回您需要的 URL 。

于 2014-07-16T20:25:57.400 回答
2

您可以添加到您的application.rb(或特定环境中config/environments/*):

config.paperclip_defaults = {
    url: "http://my.address.com/system/:class/:attachment/:id_partition/:style.:extension",
    path: ':rails_root/public/system/:class/:attachment/:id_partition/:style.:extension',
}

重新启动并重新导入您的图像。

PS:显然您可以将http://my.address.com替换为环境变量。

于 2017-06-06T15:57:51.213 回答