Get absolute URL for paperclip attachment

霸气de小男生 提交于 2019-11-29 00:40:12

问题


Is it possible to get the absolute URI for a Paperclip attachment? Right now, the problem is that the production environment is deployed in a sub-URI (on Passenger: RackBaseURI), but <paperclip attachment>.url returns the Rails-app relative URI (/system/images/...). Is there a way to get the absolute URI for Paperclip attachments?

I'm using Paperclip v2.7 and Rails 3.2.8.


回答1:


try

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

or

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

It's safe if you use S3 or absolute url.

Update: this answer is better than mine ;) https://stackoverflow.com/a/21027839/683157




回答2:


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

Relevant github issue




回答3:


According to this github issue, it is cleaner to use ActionController::Base.asset_host so it would result the helper:

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

This supposes you have in every /config/environments/<environment>.rb file the following:

Appname::Application.configure do

  # ....

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

  # ....

end



回答4:


The most widely applicable way of doing this is to first define your asset hosts in the relevant config/environment file:

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

Then in views and mailers:

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

In the console:

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

In a model:

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



回答5:


You can do this:

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

Or make a helper method to wrap it.

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

And use it like this:

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

Ex: Model = Person (@person), attachment_name = avatar, style = :thumb

<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>



回答6:


This doesn't solve the original poster's problem exactly (it operates in the view, not the model), but may be helpful for people who are trying to "get absolute URL for paperclip attachment" within their view: In the same way that

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

puts the image itself into your view,

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

returns just the URL you'll need if you want to link to the asset directly (e.g. in a link_to call).




回答7:


You can add to your application.rb (or for specific enviroment in 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',
}

Restart and reimport your images.

PS: obviously you can replace http://my.address.com with an environment variable.



来源:https://stackoverflow.com/questions/12550530/get-absolute-url-for-paperclip-attachment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!