2013-05-23 6 views
18

एक रेल 3.2 ऐप में मुझे lib फ़ाइल में url_helpers तक पहुंचने की आवश्यकता है। मैंlib मॉड्यूल में यूआरएल हेल्पर्स का उपयोग कैसे करें, और एकाधिक वातावरण के लिए होस्ट सेट करें

Rails.application.routes.url_helpers.model_url(model) 

उपयोग कर रहा हूँ, लेकिन मैं

ArgumentError (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true): 

हो रही है कि मैं इस बारे में लिखा कुछ चीजें मिल गया है, लेकिन कुछ भी वास्तव में कैसे एकाधिक वातावरण के लिए इस को हल करने के बताते हैं कि।

यानी मुझे लगता है कि मुझे अपने विकास.आरबी और उत्पादन.आरबी फाइलों में कुछ जोड़ने की ज़रूरत है, लेकिन क्या?

निकटतम मैंने config.action_mailer.default_url_option का उपयोग करके सुझाए गए उत्तर को देखा है, लेकिन यह क्रिया मेलर के बाहर काम नहीं करता है।

मेजबान को कई वातावरण के लिए सेट करने का सही तरीका क्या है?

उत्तर

33

यह एक समस्या है जिसे मैं चल रहा रहता हूं और थोड़ी देर के लिए मुझे परेशान करता हूं।

मुझे पता है कि कई लोग कहेंगे कि यह एमवीसी आर्किटेक्चर के खिलाफ मॉडल और मॉड्यूल में url_helpers तक पहुंचने के लिए जाता है, लेकिन कई बार-जैसे बाहरी एपीआई के साथ इंटरफेसिंग करते समय-जहां यह समझ में आता है।

और अब this great blog post पर धन्यवाद मुझे एक उत्तर मिला है!

#lib/routing.rb 

module Routing 
    extend ActiveSupport::Concern 
    include Rails.application.routes.url_helpers 

    included do 
    def default_url_options 
     ActionMailer::Base.default_url_options 
    end 
    end 
end 

#lib/url_generator.rb 

class UrlGenerator 
    include Routing 
end 

मैं अब किसी भी मॉडल, मॉड्यूल, वर्ग, कंसोल में निम्नलिखित, आदि

UrlGenerator.new.models_url 

परिणाम कॉल कर सकते हैं!

+0

मैं इस काम करता है इस बात की पुष्टि कर सकते हैं, लेकिन मैं एक बुरा त्रुटि जहां मैं एक विधि 'डीईएफ़ self.name' के साथ एक वर्ग था मिल गया। इस वर्ग के उदाहरण से मार्ग बनाते समय, यूआरएल जनरेटर उड़ाएगा। समाधान: किसी अन्य चीज़ के लिए 'def self.name' का नाम बदलें। – zwippie

17

एंडी सुंदर जवाब

module UrlHelpers 

    extend ActiveSupport::Concern 

    class Base 
    include Rails.application.routes.url_helpers 

    def default_url_options 
     ActionMailer::Base.default_url_options 
    end 
    end 

    def url_helpers 
    @url_helpers ||= UrlHelpers::Base.new 
    end 

    def self.method_missing method, *args, &block 
    @url_helpers ||= UrlHelpers::Base.new 

    if @url_helpers.respond_to?(method) 
     @url_helpers.send(method, *args, &block) 
    else 
     super method, *args, &block 
    end 
    end 

end 

और रास्ते में एक मामूली सुधार (कम से कम मेरे लिए) आप इसका इस्तेमाल होता है:

include UrlHelpers 
url_helpers.posts_url # returns https://blabla.com/posts 

या बस

UrlHelpers.posts_url # returns https://blabla.com/posts 

धन्यवाद एंडी! +1

+0

क्या आप जानते हैं कि यह रेल 4 में काम करता है? –

+0

हां यह रेलों पर काम करता है 4. – pratik

+0

मुझे यह काम तब तक नहीं मिल सका जब तक कि मुझे उस फ़ाइल में 'url_helpers' की आवश्यकता नहीं थी, जिसकी मुझे आवश्यकता थी। –

1

किसी भी दृश्य या नियंत्रक में एप्लिकेशन यूआरएल-हेल्पर्स काम करने के लिए किसी भी मॉड्यूल नियंत्रक में इस स्ट्रिंग का उपयोग करें।

include Rails.application.routes.url_helpers 

कृपया ध्यान दें, कुछ आंतरिक मॉड्यूल यूआरएल-हेल्पर्स को नामित किया जाना चाहिए।

उदाहरण: जड़ आवेदन

मार्गों।मॉड्यूल Eb में

Rails.application.routes.draw do 
get 'action' => "contr#action", :as => 'welcome' 
mount Eb::Core::Engine => "/" , :as => 'eb' 
end 

यूआरएल सहायकों आरबी:

users_path 

नियंत्रक में include Rails.application.routes.url_helpers जोड़े contr

तो उसके बाद सहायक

eb.users_path 
तो Eb मॉड्यूल के अंदर

होना चाहिए आप क्या आप से welcome_path रूट एप्लिकेशन के समान ही!

1

यह सुनिश्चित नहीं है कि यह रेल 3.2 में काम करता है, लेकिन रूट संस्करणों के लिए मार्गों के लिए डिफ़ॉल्ट यूआरएल विकल्प सेट करने के बाद के संस्करणों में सीधे किया जा सकता है।

उदाहरण के लिए, ActionMailer के लिए के रूप में ही विकल्पों को सेट करने:

Rails.application.routes.default_url_options = ActionMailer::Base.default_url_options 
+0

मैंने इसे प्रारंभकर्ता में जोड़ा। मेरी राय में, अन्य उत्तरों इसके बिना अपूर्ण हैं क्योंकि आपको '* _url' हेल्पर्स का उपयोग करने के लिए होस्ट की आवश्यकता है, और शायद यह ईमेल भेजने के लिए पहले से ही सेटअप है। –

संबंधित मुद्दे