2011-06-27 87 views
45

image_path僅返回路徑(無主機)。如何在Rails 3.1中獲取資源的絕對URL?

url_for幫助程序不會接受單個路徑,因此像url_for(image_path('image.png'))這樣的東西將不起作用。儘管內部url_forActionDispatch::Http::Url.url_for似乎可以訣竅(source),但它似乎沒有公共接口。

我應該怎麼做呢?最後,有一個像image_url這樣的功能就像url_for那樣對路線起作用,因此我可以撥打image_url('image.png')並獲得給定所有default_url_options的絕對URL。

+1

這個博客有一個片段,你可以使用:http://stick.gk2.sk/blog/2009/12/image_url-function-in-ruby-on-rails/ –

+0

@Spike:這種方法的缺點是它忽略了默認的url選項。例如,無法通過手動或通過應用程序配置中的default_url_options散列重寫推斷的請求參數。 –

+0

@SpikeGronim由於請求將爲空,所以這將不適用於延遲作業 – lulalala

回答

5

這樣看來,截至日前,sass-rails現在在預期SCSS文件中解釋image_url命令方式,解決相關圖像的最終位置。

+2

時破壞了嗎?有什麼方法可以在Sass之外執行此操作嗎? image_url'在視圖中不起作用 –

+0

我不完全是 –

+1

是的,這裏是我之前使用它的地方(內聯樣式):''background:url(#{asset_path('[email protected] ')})top center no-repeat;「' – courtsimas

14

在試試這個您application_helper.rb(從頁面穗列在評論之一):

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

刪除額外的斜線:'def image_url(source) 「#{root_url [0 ...-1]}#{image_path(source)}「 end' – iGEL

+0

我在使用Rails 3.1時遇到了麻煩,直到我將名稱更改爲'url_for_image'。我不確定,但我認爲正在查看'image_url'方法 –

+0

我還必須將image_url方法名稱更改爲get_image_url以使其正常工作 – tdewell

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 
49
def image_url(source) 
    URI.join(root_url, image_path(source)) 
end 

這樣,你得到的網址或者使用assets_host或root_url加盟。

+0

你在哪兒放這個代碼? – Syl

+1

@Syl在幫助程序 – tig

+1

中,你必須添加'add_template_helper(MailerHelper)'給郵件程序以使助手工作在3.2 – Syl

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 
+0

這個答案略有不同,如果使用渦輪鏈輪,順便說一句。 – courtsimas

0

您可以定義任何背景圖像或其他資產的絕對URL的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); 
}