如何在Rails 3.1中获取资产的绝对URL?

时间:2011-06-27 23:15:24

标签: ruby-on-rails ruby-on-rails-3

image_path仅返回路径(无主机)。

url_for助手不接受单一路径,因此url_for(image_path('image.png'))之类的东西不起作用。虽然url_for中的内部ActionDispatch::Http::Url.url_for似乎可以解决问题(source),但似乎没有公共接口。

我应该怎么做呢?最终,有一个像image_url这样的函数可以像url_for那样为路由做,这样我就可以调用image_url('image.png')并获得所有{{1}的绝对URL }}

7 个答案:

答案 0 :(得分:51)

def image_url(source)
  URI.join(root_url, image_path(source))
end

这样您就可以使用assets_host或使用root_url加入网址。

答案 1 :(得分:14)

在您的application_helper.rb中尝试此操作(来自Spike页面上的其中一条评论):

def image_url(source)
  "#{root_url}#{image_path(source)}"
end

答案 2 :(得分:7)

我们的生产和暂存资产位于s3 / cloudfront ......但不是本地/ dev。所以我写了这个(可能是矫枉过正,可能会简化):

  def get_digest_file(source)
     return asset_path(source.to_s.downcase) unless Rails.application.config.assets.digests.present?
     return ActionController::Base.asset_host + "/assets/" + Rails.application.config.assets.digests[source.to_s.downcase]
  end

答案 3 :(得分:5)

从最近开始,sass-rails现在以预期的方式解释scss文件中的image_url命令,并解析到相关图像的最终位置。

答案 4 :(得分:4)

来自Full url for an image-path in Rails 3

request.protocol + request.host_with_port + image_path('image.png')

你甚至可以创建一个帮助来干它,比如

def full_image_path(img_path)
    request.protocol + request.host_with_port + image_path(img_path)
end

答案 5 :(得分:0)

您可以为任何背景图片或其他资源定义带绝对网址的css。因此,您可以按照How to get absolute image paths in your css files using sass/scss动态生成它。

<强> CSS

body {
  background-image: image-url(background.png);
}

在您的环境文件中使用您的文件进行更改

config.action_controller.asset_host = "http://your.domain.com/"

然后你的CSS会看起来像那样:

body {
  background-image: url(http://your.domain.com/assets/background.png);
}

答案 6 :(得分:0)

如果遇到无法从视图访问root_url的问题,可以将其传递到视图,也可以添加.env变量,然后在其中调用根。

asset_url('image.png', host: "https://#{ENV['HOSTNAME']}/")