5
में कोड निष्पादित

मैं अपने रेल प्लगइन उन्नयन कर रहा हूँ एक इंजन है कि नवीनतम 3.0rc1 रिलीज के साथ काम करता है होना करने के लिए और मैं सबसे अच्छा (और सबसे सही) जिस तरह से पता लगाना विस्तार करने के लिए मुसीबत का एक सा हो रही है ActionController। मैंने एसएच पर this post और डीएचएच द्वारा this question देखा है, लेकिन मेरा प्रश्न ActionController के भीतर कोड को सही तरीके से कॉल करने के तरीके के बारे में अधिक है।रेल 3.0 इंजन - ActionController

उदाहरण के लिए, मैं अपने इंजन के नियंत्रक के भीतर निम्नलिखित कॉल करने की आवश्यकता:

class ApplicationController < ActionController::Base 
    helper :all 

    before_filter :require_one_user 
    after_filter :store_location 

    private 
    def require_one_user 
     # Code goes here 
    end 

    def store_location 
     # Code goes here 
    end 
end 

मैं जानता हूँ कि कैसे ठीक मेरे दो निजी कार्यों के शामिल करने के लिए है, लेकिन मैं इसे ठीक से कॉल करने के लिए प्राप्त करने के लिए एक तरह से नहीं मिल सकता है helper, before_filter और after_filter

मैं इस काम को करने के लिए कुछ लिंक या एक तरीका की सराहना करता हूं। मैंने अपने नियंत्रक को ApplicationController के अलावा कुछ और नाम देने का प्रयास किया है और वास्तविक ApplicationController इसे विस्तारित किया है, लेकिन ऐसा लगता है कि यह भी काम नहीं करता है। मैं वास्तव में किसी भी समाधान के लिए तैयार हूं जो इंजन उपयोगकर्ता के जीवन को यथासंभव आसान बनाता है। आदर्श रूप से, उन्हें अपनी कक्षा का विस्तार नहीं करना पड़ेगा, लेकिन उनके पास अपनी कार्यक्षमता ApplicationController में बनाई गई होगी।

उत्तर

10

आप भी अपने इंजन उपवर्ग अंदर initializers में देखना चाहते हो सकता है, तो आप अपने नियंत्रक वर्ग के अंदर दृश्य सहायकों को शामिल करने की जरूरत नहीं है। और यह आपको इन मॉड्यूल के लोड ऑर्डर पर नियंत्रण देगा।

यहाँ मैं क्या उपयोग किया गया है है:

 

module MyEngine 
    class Engine < Rails::Engine 
    initializer 'my_engine.helper' do |app| 
     ActionView::Base.send :include, MyEngineHelper 
    end 

    initializer 'my_engine.controller' do |app| 
     ActiveSupport.on_load(:action_controller) do 
     include MyEngineActionControllerExtension 
     end 
    end 
    end 
end 
 

इसके अलावा, कार्रवाई नियंत्रक विस्तार के लिए एक और विकल्प एक mixin मॉड्यूल का उपयोग कर रहा है। यह आपको after_filter, before_filter का उपयोग आदि दूँगी ..

 

module MyEngineActionControllerExtension 
    def self.included(base) 
    base.send(:include, InstanceMethods) 
    base.before_filter :my_method_1 
    base.after_filter :my_method_2 
    end 

    module InstanceMethods 
    #........... 
    end 
end 
 

एक अन्य बात यह है कि ... यदि आप अपने मणि के शीर्ष स्तर पर डिफ़ॉल्ट रेल निर्देशिका बनाने के लिए, आप की आवश्यकता होती है के बारे में चिंता करने की जरूरत नहीं सहायक या नियंत्रक। आपके इंजन उपclass उनके पास पहुंच है। मैं इस सेटअप की तरह है क्योंकि यह application_controller और अपने रेल app में application_helper के समान दिखता है

 
/myengine/app/helpers/myengine_application_helper_extension.rb 
/myengine/app/controllers/my_engine_action_controller_extension.rb 

: तो मैं अपने आवेदन नियंत्रक और आवेदन सहायक एक्सटेंशन यहां जोड़ें।दोबारा, यह सिर्फ व्यक्तिगत वरीयता है, लेकिन मैं सीधे रेल से संबंधित कुछ भी रखने की कोशिश करता हूं, जैसे कंट्रोलर, हेल्पर्स और मॉडलों के अंदर/my_engine/ऐप और प्लगइन से संबंधित कुछ भी सामान्य/my_engine/lib

initializers बारे में अधिक जानकारी के लिए जोस Valim द्वारा इस ट्यूटोरियल की जाँच करें: https://gist.github.com/e139fa787aa882c0aa9c (ENGINE_NAME अब पदावनत है, लेकिन इस डॉक के सबसे अप करने की तारीख लगती है)

+0

+1 और स्वीकृत - धन्यवाद इस भयानक writeup के लिए! मैं आपको समय लेने की सराहना करता हूं भले ही मैंने इसे पहले ही "उत्तर दिया"। एक और सुरुचिपूर्ण समाधान देखना अच्छा लगता है। ओह, और स्टैक ओवरफ़्लो में आपका स्वागत है :-) –

3

तो, आखिरकार, मैंने समाधान का पता लगाया और मुझे उम्मीद है कि यह किसी और की मदद करेगा।

आपको अपनी lib निर्देशिका में एक फ़ाइल बनाने की आवश्यकता है क्योंकि आप वास्तव में कक्षा का विस्तार करने जा रहे हैं। मैंने myplugin/lib/extensions/action_controller_base.rb किया था।

फिर, अपने myplugin/lib/myplugin.rb फ़ाइल के अंदर, निम्न करें:

require 'action_controller' # Make sure ActionController::Base is defined 

ActionController::Base.class_eval { 
    private 
    def my_method_1 
     # Code Goes Here 
    end 

    def my_method_2 
     # Code Goes Here 
    end 
} 

ActionController::Base.instance_eval { 
    helper_method :my_method_1, :my_method_2 

    before_filter :my_method_1 
    after_filter :my_method_2 
} 

आप, दृश्य सहायकों उन्हें myplugin/lib/helpers में बनाने की आवश्यकता है:

require 'extensions/action_controller_base.rb' 

myplugin/lib/extensions/action_controller_base.rb के अंदर निम्नलिखित डाल निर्देशिका (या lib के अंदर कुछ भी, नाम "सहायक" कोई फर्क नहीं पड़ता) और myplugin/lib/extensions/action_controller_base.rb के नीचे निम्न को जोड़ें:

require 'helpers/helper_file_1' 
require 'helpers/helper_file_2' 

ActionView::Base.send :include, MyHelper1 
ActionView::Base.send :include, MyHelper2 
संबंधित मुद्दे