开发者

Rails 3.1 absolute URL to an image

I'm using Rails 3.1. I'm trying to figure this out, and to my surprise, it is starting to seem that rails does not come with this method at all. Maybe im wrong.

Can anyone show how I can get a full absolute URL to an image?

I use asset_path(image.png) which gi开发者_如何学JAVAves me the relative path to use within the app. I tried doing a root_url + asset_path(image.png) but that just gives me a http://localhost:3000//assets/image.png with the double slashes

Anyone have an efficient way of doing this?


See the Using asset hosts section in the documentation. You need to specify an asset_host. You can also construct it dynamically from the request chaining "#{request.protocol}#{request.host_with_port}"


put this in application_helper.rb

def asset_url asset
  "#{request.protocol}#{request.host_with_port}#{asset_path(asset)}"
end

then you can use asset_url in your views.


For Rails 4, and maybe earlier, use:

config.action_mailer.asset_host = 'https://assets.com'

per https://github.com/fphilipe/premailer-rails/issues/16


In my config/environments/*.rb I already have this tailored for each environment:

config.domain = 'mysite.dev'

So it was a simple matter of adding

config.action_controller.asset_host = "http://" + config.domain

to each file. Then asset_path will miraculously behave as if it were asset_url.


Example folder structure.

app/
   assets/
      flags/
         32x32/
            en.png
         256x256/
            en.png

If you want to generate absolute flag image path we can add in to our ApplicationHelper two methods:

module ApplicationHelper

  # Generate flag path by locale
  # - locale. Can be "en", "it", etc.
  # - flag_size. Will be used to set folder size. Folder size can be "32x32", "256x256".
  # Return flag image path. Path will absolute
  def generate_flag_path_by_locale(locale, folder_size = "32")
    folder = "#{flag_size}x#{flag_size}"
    domain_absolute_path = generate_domain_absolute_path
    flag_path = ("#{domain_absolute_path}/assets/flags/#{folder}/#{locale}.png")

    return flag_path
  end

  # Generate domain absolute path
  def generate_domain_absolute_path
    request_protocol = request.protocol
    request_host_with_port = request.host_with_port
    domain_absolute_path = request_protocol + request_host_with_port

    return domain_absolute_path
  end
end

Into our apps/view/products.html.erb. We must to call only:

<% flag_path = generate_flag_path_by_locale("en") %> 

Final result:

http://my_domain.com:3000/assets/flags/32x32/en.png


Could you just do:

root_url[0..-2] + asset_path(image.png)

...to trim the trailing slash in the root url?


You need to use 'asset_url' instead *asset_path*.

Bcz '_path' always return relative path and '_url' will return absolute url.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜