2011-09-28 7 views
8

मैं एक mountable इंजन के एक लेआउट के अंदर से पता करने के लिए, की जरूरत पर रखा है, क्या पथ यह वर्तमान पर रखा जा रहा है। ऐसा करने का तरीका क्या होगा?क्या पथ एक mountable इंजन

उदा। मेरी routes.rb निम्न पंक्ति में शामिल हैं:

mount BackendCore::Engine => "/backend" 

BackendCore के अंदर से, मैं "/ बैकएंड" का मान के लिए उपयोग की जरूरत है।

+0

संभव डुप्लिकेट: URL से कार्रवाई का नाम लगता है] (http://stackoverflow.com/questions/3481731/reverse-rails-routing-find-the-the-action-name-from-the-url) –

+1

लिंक आप प्रदान करता है ज्यादा मदद नहीं करते, क्योंकि इसमें इंजनों का कोई संदर्भ नहीं है, हालांकि यह खोज करने की दिशा देता है। – mxgrn

उत्तर

8

अद्यतन: यह शायद केवल 3 रेल पर लागू होता है!

Rails.application.routes.named_routes[:backend_core].path #=> "/backend" 
+1

धन्यवाद साथी, यह एक वास्तव में मुझे बाहर :) –

9

इंजन :as => एक अलग नाम बढ़ते है, तो क्वेरी करने named_routes काफी नहीं होगा:

मैं समाधान मिल गया। इस बंदर पैच करना होगा:

BackendCore::Engine.mounted_path => "/backend" 

नोट::

class Rails::Engine 
    def self.mounted_path 
    route = Rails.application.routes.routes.detect do |route| 
     route.app == self 
    end 
    route && route.path 
    end 
end 

अब इंजन पर mounted_path फोन सावधान, उत्पादन मोड में होना, अपने इंजन में कक्षाएं मुख्य एप्लिकेशन के मार्गों से पहले मूल्यांकन किया जाता है लोड हो गए हैं कक्षा मैक्रोज़ में इस विधि को कॉल करना काम नहीं कर सकता है!

+0

मदद की रेल 4 इंजन में इस तकनीक का उपयोग करना। धन्यवाद! – RailinginDFW

3

माउंट पथ पाने के लिए जब इंजन अन्य इंजनों के अंदर रखा जाता है अप्रत्याशित परिणाम दे सकते हैं मार्गों का मूल्यांकन।

जब आप https://github.com/rails/rails/pull/5008 पर एक नज़र डालें आप जोस Valim द्वारा टिप्पणी पढ़ सकते हैं:

इसके अलावा, एक इंजन एक और इंजन के अंदर स्थापित किया जा सकता, तो यह है कि इस आप उचित परिणाम दे देंगे संभावना नहीं है। सबसे अच्छा विकल्प शायद कॉन्फ़िगरेशन विकल्प है जहां डेवलपर पथ सेट करेगा।

लगातार परिणामों के लिए, अब मैं इंजन पर एक एक्सेसर का उपयोग कर रहा हूं।

उदाहरण के लिए:

# APP/initializers/backend_core_engine.rb 
BackendCore::Engine.mount_path = "/backend" 

# APP/config/routes.rb 
mount BackendCore::Engine => BackendCore::Engine.mount_path 

# ENGINE/backend_core/lib/engine.rb 
module BackendCore 
    class Engine < ::Rails::Engine 
    cattr_accessor :mount_path 
    end 
end 
-1

आप बस निम्नलिखित कोड बताने के लिए पथ इंजन एक इंजन नियंत्रक/दृश्य के अंदर करने के लिए माउंट है इस्तेमाल कर सकते हैं:

env["SCRIPT_NAME"] # => "/backend" 
की [रिवर्स मार्ग रेल
+0

बस जिज्ञासा, यह क्यों कम हो गया है? –

+0

पता नहीं :(कोई प्रतिक्रिया और मैं एक downvote :( –

+0

यह कोई स्पष्टीकरण के साथ एक downvote पाने के लिए संभव नहीं होना चाहिए। मैं कैसे विश्वास कर सकते हैं कि अगर downvote समझ में आता है या नहीं मिला करते हैं? –

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