25

के भीतर किसी इंजन के सहायक का पर्दाफाश करने का बेहतर तरीका मुझे उपभोक्ता (माता-पिता) एप्लिकेशन के लिए पहुंच योग्य नहीं होने वाले इंजन के भीतर मददगारों के मुद्दे को संबोधित करने वाले कुछ लेख मिल गए हैं।रेल 3.1: क्लाइंट ऐप

module MyEngine 
    module ImportantHelper 
    def some_important_helper 
     ...do something important... 
    end 
    end 
end 

आप "पृथक इंजन के सहायकों" में rails engine प्रलेखन को देखें, तो (L293), यह कहते हैं::

# Sometimes you may want to isolate engine, but use helpers that are defined for it. 
    # If you want to share just a few specific helpers you can add them to application's 
    # helpers in ApplicationController: 
    # 
    # class ApplicationController < ActionController::Base 
    # helper MyEngine::SharedEngineHelper 
    # end 
    # 
    # If you want to include all of the engine's helpers, you can use #helpers method on an engine's 
    # instance: 
    # 
    # class ApplicationController < ActionController::Base 
    # helper MyEngine::Engine.helpers 
    # end 
यकीन है कि हम एक ही पृष्ठ पर सभी कर रहे हैं बनाने के लिए, मान लीजिए कि हम इस डालते हैं

तो अगर मैं अपने इंजन लेने वाली उनकी application_controller.rb में जोड़ने के लिए किसी को भी पूछते हैं, तो वे पहुँच अपने सभी महत्वपूर्ण सहायक तरीकों को मिलेगा:

class ApplicationController < ActionController::Base 
    helper MyEngine::ImportantHelper 
end 

यह जो मैं चाहता है और मैं टी काम करता है, लेकिन यह एक प्रकार का दर्द है, खासतौर से यदि, मेरा उपयोग मामला है, तो उपभोग करने वाले ऐप में इंजन का खुलासा कहीं भी किया जा सकता है। इसलिए मैं थोड़ा और चारों ओर खोदा और एक समाधान है कि मैं निम्नलिखित है सुझाव दिया पाया: माता-पिता को एप्लिकेशन की आवेदन सहायक अपने सभी ImportantHelper विधि जोड़ने के लिए:

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    config.to_prepare do 
     ApplicationController.helper(ImportantHelper) 
    end 
    end 
end 

अब इस बिल्कुल जो मैं चाहता है। हालांकि, यह काम नहीं करता है। क्या कोई मुझे यह समझने में मदद कर सकता है कि यह बेहतर समाधान क्यों काम नहीं करता है?

मैं रेल 3.1.3 के साथ रूबी 1.8.7 चला रहा हूं। अगर मुझे इस मुद्दे पर जर्मनी की कोई महत्वपूर्ण जानकारी याद आती है, तो मुझे बताएं, और अग्रिम धन्यवाद।

उत्तर

44

तुम इतनी तरह यह पूरा करने के लिए एक प्रारंभकर्ता बना सकते हैं:

module MyEngine 
    class Engine < Rails::Engine 
    initializer 'my_engine.action_controller' do |app| 
     ActiveSupport.on_load :action_controller do 
     helper MyEngine::ImportantHelper 
     end 
    end 
    end 
end 
+0

आप वास्तव में और भी सरल बना सकते हैं: सहायक माईइंजिन :: महत्वपूर्ण हेल्पर भेजो बाहर। मैंने अपनी पोस्ट अपडेट की है। – JDutil

+0

क्या यह बदल गया है? ऐसा लगता है कि * सभी * मेरे हेल्पर्स उपरोक्त कोड के बिना स्वचालित रूप से लोड हो जाते हैं! मेरा इंजन यहां है: https: // github।com/sientia-jmu/iq_menu –

+0

ऐसा लगता है कि कम से कम प्रत्येक कंट्रोलर को प्रत्येक कंट्रोलर में स्वचालित रूप से शामिल किया जाता है, कम से कम जब ''full' इंजन होता है। –

1
module YourEngine 
    module Helpers 
    def a_helper 
    end 

    ... 
    end 
end 

ActionController::Base.send(:helper, YourEngine::Helpers) 
6

मैं खरोंच से इंजन बनाने, और उन्हें सब कुछ निम्नलिखित आवश्यक अतिरिक्त विन्यास के बिना अपेक्षा के अनुरूप काम करना चाहिए (लगभग दो ब्लॉग पोस्ट में लिखा है)। हो सकता है कि आप अभी भी में रुचि रखते हैं:

अद्यतन: यह बीच में तीन लेख है, और वहाँ अभी भी आने के लिए कुछ जानकारी है। कृपया मुझे प्रतिक्रिया दें।

+0

लिंक मर चुका है: / – Waclock

6

आप हर लागू करने आवेदन करने के बजाय, इंजन में कोड रखना चाहते हैं, इस का उपयोग करें:

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    config.to_prepare do 
     MyEngine::ApplicationController.helper Rails.application.helpers 
    end 

    end 
end 
1

engine.rb में इस कोड को शामिल करें भी है बहुत उपयोगी हो

config.before_initialize do 
    ActiveSupport.on_load :action_controller do 
    helper MyEngine::Engine.helpers 
    end 
end 

असल में आपका इंजन

module MyEngine 
    class Engine < Rails::Engine 
    isolate_namespace MyEngine 

    # Here comes the code quoted above 

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