2012-02-10 14 views
22

ओवरराइड करते हैं तो मैंने एप्लिकेशन को कुछ सामान्य कार्यक्षमता (फोटो गैलरी) प्रदान करने के लिए एक सरल रेल इंजन बनाया है। मैं मानक _header आंशिक ओवरराइड करने में सक्षम होना चाहता हूं ताकि गैलरी के लिए मेनू मेरे मुख्य एप्लिकेशन से मेल खाता हो। मेरे हेडर व्यू में मैं एक सहायक को कॉल करता हूं जो application_helpers (मुख्य ऐप) का हिस्सा है, लेकिन मुझे "अपरिभाषित विधि" त्रुटियां मिल रही हैं। जब मैं इंजन एप्लिकेशन लेआउट या इसके आंशिक ओवरराइड करता हूं तो मैं मुख्य ऐप एप्लिकेशन_हेल्पर को शामिल नहीं कर सकता हूं (स्पष्ट रूप से)।एक्सेस मुख्य ऐप हेल्पर्स जब एक रेल इंजन इंजन/लेआउट

तो मेरा सवाल यह है कि, मैं मुख्य एप्लिकेशन में इंजन दृश्य को ओवरराइड कैसे कर सकता हूं, और मुख्य एप्लिकेशन सहायक विधियों तक पहुंच प्राप्त कर सकता हूं? मुझे अभी भी इंजन सहायकों तक पहुंच की आवश्यकता होगी और इंजन की कार्यक्षमता को खराब नहीं किया जाएगा।

क्या मुझे नियंत्रकों को ओवरराइड करने की आवश्यकता है? कुछ सहायकों को पाने के लिए बहुत कुछ लगता है।

धन्यवाद

रेल 3.1.3

+5

आप 'main_app.your_helper_method' की कोशिश की है? – glebm

+0

इस [प्रश्न] में उल्लिखित विधि का प्रयास करें (http://stackoverflow.com/questions/10879150/isolated-engine-doorkeeper-use-helper-methods-from-the-main-app) अगर आप नहीं चाहते हैं नियंत्रकों को ओवरराइड करें – Matt

उत्तर

1

आदेश इंजन सहायक तरीकों को ओवरराइड करने में अपने इंजन में सहायक का एक ही नाम के साथ अपने आवेदन में एक सहायक बनाने का प्रयास करें।

मुझे this discussion विशेष रूप से अंतर्दृष्टि मिली। के तहत Rails Engine API docs में कुछ रोचक विचार भी हैं जो पृथक इंजन सहायक हैं।

+0

रेल इंजन इंजन दस्तावेज़ों ने मुझे url_helpers के लिए एक अच्छा समाधान जानने में मदद की! धन्यवाद। –

2

मुख्य ऐप सहायक विधियों को शामिल करने का प्रयास करें। उदाहरण के लिए:

class MyEngineClass 
    include ApplicationHelper 

    #... 
end 

आपको शायद पहले फ़ाइल की आवश्यकता हो सकती है, हालांकि मैं उम्मीद करता हूं कि रेल इस मामले में इसे सही तरीके से ढूंढें।

एक बार एप्लिकेशनहेल्पर शामिल होने के बाद, आप सीधे उन सहायकों को नियंत्रक में उपयोग करने में सक्षम होना चाहिए।

ऐसा लगता है कि आप बहुत सारे रेल वर्गों के लिए ClassName.helper("application") पर कॉल कर सकते हैं - यह सुनिश्चित नहीं है कि यह यहां काम करेगा या नहीं।

0

अस्वीकरण: मैंने रेलवे 3.2 इंजनों में केवल इस समाधान का उपयोग किया है।

यदि आपके इंजन में आपके पास मानक हेडर आंशिक विक्रेता/रत्न/my_gallery_engine/ऐप/विचार/एप्लिकेशन/_header.html.erb है।

फिर, इसे अनुकूलित आंशिक ऐप/दृश्य/एप्लिकेशन/_header.html.erb बनाकर अपने मुख्य ऐप में ओवरराइड करें।

ओवरराइड काम करता है क्योंकि रेल एप्लिकेशन/विचारों निर्देशिका 'दृश्य टेम्पलेट खोज (डिफ़ॉल्ट रूप से) पथ मुख्य क्षुधा के साथ शुरू होता', और फिर इंजन 'एप्लिकेशन/लोड क्रम में देखा गया के माध्यम से खोज करता है।

आपके सभी मुख्य ऐप के हेल्पर्स आंशिक रूप से उपलब्ध होंगे।

1

इंजन मुख्य ऐप से स्वतंत्र होना चाहिए, यही कारण है कि आप इंजन से अपने सहायकों तक नहीं पहुंच सकते हैं।

हालांकि, आपके ऐप को मुख्य ऐप के सहायकों तक पहुंचने के लिए हैक-इश तरीके हैं।इस तरह मैंने किया है:

# In the main app 
# initializers/share_helpers_path_with_engine.rb 
PhotoGallery::Engine.class_eval do 
    paths["app/helpers"] << File.join(File.dirname(__FILE__), '../..', 'app/helpers') 
end 

आप अपने इंजन वर्ग का वास्तविक नाम को PhotoGallery बदलने के लिए निश्चित रूप से की जरूरत है। http://edgeapi.rubyonrails.org/classes/Rails/Engine.html

3

इस ब्लॉग पोस्ट की जांच:

इंजन प्रलेखन (पथ के बारे में खंड) पर एक नज़र लेने के लिए स्वतंत्र महसूस http://www.candland.net/2012/04/17/rails-routes-used-in-an-isolated-engine/ लेखक एक method_missing परिभाषा आवेदन सहायक के लिए माता-पिता तक पहुँचने के लिए कहते हैं आवेदन के सहायक

/config/initializers/blogit.rb

module Blogit 
    module ApplicationHelper 
     def method_missing method, *args, &block 
     puts "LOOKING FOR ROUTES #{method}" 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      main_app.send(method, *args) 
      else 
      super 
      end 
     else 
      super 
     end 
     end 

     def respond_to?(method) 
     if method.to_s.end_with?('_path') or method.to_s.end_with?('_url') 
      if main_app.respond_to?(method) 
      true 
      else 
      super 
      end 
     else 
      super 
     end 
     end 
    end 
    end 
+1

यह सिर्फ '_path' और' _url' हेल्पर्स जोड़ता है जो मुझे चाहिए। यद्यपि एक बेहतर समाधान है। अपने इंजन के 'एप्लिकेशन नियंत्रक' में 'सहायक रेल .application.routes.url_helpers' जोड़ें। लिंक की गई ब्लॉग पोस्ट पर मेरी टिप्पणियां देखें। –

+0

ओपी के लिए, आप शायद 'हेल्पर Rails.application.helpers' के साथ एक ही तकनीक का उपयोग कर सकते हैं। –

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

  • कोई संबंधित समस्या नहीं^_^