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 }}
答案 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']}/")