如何获取Paperclip附件的绝对URI?目前的问题是生产环境部署在子URI上(通过Passenger:RackBaseURI
),但<paperclip attachment>.url
返回的是Rails应用程序相对URI(/system/images/...
)。有没有一种方法来获取Paperclip附件的绝对URI?
我正在使用Paperclip v2.7和Rails 3.2.8。
如何获取Paperclip附件的绝对URI?目前的问题是生产环境部署在子URI上(通过Passenger:RackBaseURI
),但<paperclip attachment>.url
返回的是Rails应用程序相对URI(/system/images/...
)。有没有一种方法来获取Paperclip附件的绝对URI?
我正在使用Paperclip v2.7和Rails 3.2.8。
尝试
URI.join(request.url, @model.attachment_name.url)
或者URI(request.url) + @model.attachment_name.url
如果您使用S3或绝对URL,则是安全的。
更新:这个答案比我的更好 ;) https://dev59.com/Z2cs5IYBdhLWcg3w0HSz#21027839
request
仅可在控制器和视图中使用。 - radexActionController::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
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))
<%= 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)}" %>
config.action_controller.asset_host
时,这将无法正常工作,因为它会给你重复/损坏的协议+主机。 - glasz虽然这并不能完全解决原帖作者的问题(它在视图中操作,而不是模型),但对于那些试图在视图中“获取Paperclip附件的绝对URL”的人可能会有所帮助:以同样的方式
image_tag(user.avatar.url(:large))
image_url(user.avatar.url(:large))
如果您想直接链接到资源(例如在link_to
调用中),则只需返回您需要的URL。
您可以在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',
}
重新启动并重新导入您的图像。
附注:显然,您可以用环境变量替换http://my.address.com。
asset_url
不能直接在控制器中使用,但是URI.join
可以 :-) - Francis.TM