2011-06-27 15 views
45

image_path केवल एक पथ (कोई होस्ट नहीं) देता है।मैं रेल 3.1 में किसी संपत्ति के लिए एक पूर्ण URL कैसे प्राप्त करूं?

url_for सहायक एक ही पथ स्वीकार नहीं करेगा, इसलिए url_for(image_path('image.png')) जैसे कुछ काम नहीं करेगा। जबकि ActionDispatch::Http::Url.url_for में चाल (source) करने के लिए प्रतीत होता है, इसके लिए एक सार्वजनिक इंटरफ़ेस प्रतीत नहीं होता है।

मुझे इसे करने के बारे में कैसे जाना चाहिए? आखिरकार, image_url जैसे फ़ंक्शन के लिए यह अच्छा लगेगा कि url_for जैसे मार्गों के लिए काम करता है ताकि मैं image_url('image.png') पर कॉल कर सकूं और default_url_options को पूरा यूआरएल प्राप्त कर सकूं।

+1

इस ब्लॉग एक स्निपेट है तो आप इसका उपयोग कर सकते हैं: http://stick.gk2.sk/blog/2009/12/image_url-function-in-ruby-on-rails/ –

+0

@ स्पाइक: उस दृष्टिकोण के साथ कमी यह है कि यह डिफ़ॉल्ट यूआरएल विकल्पों को अनदेखा करता है। उदाहरण के लिए, ऐप कॉन्फ़िगरेशन में या तो मैन्युअल रूप से या default_url_options हैश के माध्यम से अनुमानित अनुरोध पैरा को ओवरराइड करने का कोई तरीका नहीं होगा। –

+0

@SpikeGronim यह देरी की नौकरियों के साथ काम नहीं करेगा क्योंकि अनुरोध खाली होगा – lulalala

उत्तर

5

ऐसा लगता है हाल ही में के रूप में, sass-rails अब उम्मीद में एक एससीएसएस फ़ाइल के भीतर image_url आदेश समझता है कि वह प्रश्न में छवि के अंतिम स्थान को हल करने का तरीका।

+2

सास के बाहर ऐसा करने का कोई तरीका है? ' image_url' विचारों में काम नहीं करता है। –

+0

मैं पूरी तरह से –

+1

हाँ नहीं हूं। यहां है जहां मैंने इसे पहले उपयोग किया है (एक इनलाइन शैली): '" पृष्ठभूमि: url (# {property_path ([email protected] ')}) शीर्ष केंद्र नो-दोहराना; "' – courtsimas

14

में इस प्रयास करें अपने application_helper.rb (सूचीबद्ध पेज स्पाइक पर टिप्पणियों में से एक से):

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

अतिरिक्त स्लैश को हटाने के लिए: 'def image_url (स्रोत) " # {root_url [0 ...-1]} # {image_path (स्रोत)} " अंत' – iGEL

+0

मुझे रेल 3.1 में इसका उपयोग करने में परेशानी थी जब तक कि मैंने नाम को 'url_for_image' में बदल दिया। मुझे यकीन नहीं है, लेकिन मुझे लगता है कि विधि' image_url' देखा जा रहा था एक मार्ग के रूप में। –

+0

मुझे इसे पाने के लिए get_image_url में 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 

इस तरह आप URL प्राप्त कुछ बना सकते हैं या तो assets_host का उपयोग कर या root_url के साथ शामिल होने।

+0

आप इस कोड को कहां रखते हैं? – Syl

+1

@Syl एक सहायक में – tig

+1

जानकारी के लिए आपको हेल्पर काम करने के लिए मेलर में' add_template_helper (MailerHelper) 'जोड़ना होगा 3.2 – Syl

7

हमारे उत्पादन और स्टेजिंग संपत्ति एस 3/क्लाउडफ़्रंट पर हैं ... लेकिन स्थानीय रूप से/देव नहीं। इसलिए मैं यह लिखा (overkill हो सकता है, और शायद सरल किया जा सकता):

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

आप किसी भी पृष्ठभूमि छवि या अन्य संपत्ति के लिए पूर्ण यूआरएल के साथ सीएसएस परिभाषित कर सकते हैं। तो आप इसे How to get absolute image paths in your css files using sass/scss के बाद गतिशील रूप से उत्पन्न कर सकते हैं।

सीएसएस

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

अपने वातावरण फ़ाइल में यह तुम्हारा साथ बदल

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

फिर अपने सीएसएस कि कुछ ऐसी दिखाई देगी:

body { 
    background-image: url(http://your.domain.com/assets/background.png); 
} 
संबंधित मुद्दे