2012-06-29 12 views
6

मैं अपने मानक रेल ऐप को एक आरोही इंजन में बदलने की प्रक्रिया में हूं। ऐप एक मानक ब्लॉगिंग ऐप से तुलनीय है और मैं प्रत्येक मॉडल, नियंत्रक और विस्तार योग्य होने के लिए देखना चाहता हूं इसलिए एक माउंटेबल इंजन के लिए मेरी पसंद।रेल माउंटेबल इंजन और एक और इंजन ओवरराइडिंग

मैं जिन रत्नों का उपयोग करता हूं उनमें से एक है डेविस जो कि मैं एक माउंटेबल इंजन के रूप में समझता हूं। इसका उपयोग एक माउंटेबल इंजन के अंदर किया जा सकता है जैसा कि here कहा गया है।

मैं इसे अपने इंजन के भीतर आंशिक रूप से उपयोग करने में सक्षम हूं। सब कुछ कुछ वसीयत नियंत्रक मैं इस तरह ओवरराइड सहित ठीक काम कर रहा है:

# config/routes.rb 

Bbronline::Engine.routes.draw do 
    devise_for :users, class_name: "Bbronline::User", module: :devise, 
    controllers: { registrations: "bbronline/devise_overrides/registrations"} 
    ... 

# controllers/bbronline/devise_overrides/registrations_controller.rb 
require_dependency "bbronline/application_controller" 

module Bbronline 

class DeviseOverrides::RegistrationsController < Devise::RegistrationsController 

    def new_intermediair 
    @user = User.new 
    end 
    ... 

सही दृश्य के विचारों/bbronline/devise_overrides/पंजीकरण/new_intermediair.html.haml 'भी सही ढंग से अपेक्षा के अनुरूप लोड कर रहा है।

हालांकि मेरी समस्या यह है कि जिन विचारों को मैं कस्टम नियंत्रक के बिना ओवरराइड करता हूं वे ठीक से लोड नहीं होते हैं। उदाहरण के लिए, दृश्य दृश्य जो views/bbronline/devise/sessions/new.html.haml में स्थित है और लोड नहीं किया गया है। इसके बजाय मानक डेविस लॉगिन दृश्य लोड हो जाता है i.e. devise-2.1.0/app/views/devise/sessions/new.html.erb

बेशक मैं अपने नियंत्रक के साथ हर नियंत्रक को ओवरराइड करके इस समस्या को हल कर सकता हूं जैसे मैंने रजिस्ट्रेशन_कंट्रोलर के साथ किया था लेकिन यह बहुत बदसूरत लगता है। क्या हर नियंत्रक को ऐसा करने का तरीका ओवरराइड कर रहा है? क्या एक आरोही इंजन से दूसरे माउंटेबल इंजन के भीतर से विचारों को ओवरराइड करने का एक और सुविधाजनक तरीका है?

उत्तर

4

view_paths गलत क्रम में हैं। वसीयत :: SessionsController को देखते रास्तों जाँच हो रही है पता चलता है:

Devise::SessionsController.view_paths 
=> #<ActionView::PathSet:0x007fa1bf0e36f8 @paths= [/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/test/‌​dummy/app/views, 
/Users/harmdewit/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/devise-2.1.‌​0/app/views, 
/Users/harmdewit/Dropbox/Code/projects/brightin/bbr-online/bbr-online-gem/app/vi‌​ews]> 

mountable इंजन के अंतिम पथ बीच वसीयत पथ से पहले आना चाहिए। समाधान इस तरह application.rb में लोड हो रहा है प्राथमिकता स्थापित कर रही है: सही दिशा में इशारा करते हुए के लिए जोस Valim को http://api.rubyonrails.org/classes/Rails/Engine.html#label-Loading+priority

धन्यवाद:

#test/dummy/config/application.rb (the app that uses my mountable engine) 
... 
config.railties_order = [Blog::Engine, :main_app, :all] 
... 

यह भी रेल एपीआई में प्रलेखित है।

+2

किसी भी तरह से मैं अपने डमी एप्लिकेशन की कॉन्फ़िगरेशन को बदलने के बिना यह परिवर्तन कर सकता हूं? जब भी मैं अपना मणि लोड करता हूं तो मैं इसे डिफ़ॉल्ट व्यवहार करना पसंद करूंगा। – Ajedi32

1

मुझे और जानकारी चाहिए। आप कौन सा नियंत्रक परिभाषित कर रहे हैं और किस नियंत्रक से इसे विरासत में मिला है? कौन सा विचार प्रस्तुत किया जा रहा है और आप किसने प्रस्तुत करने की उम्मीद की थी? इसके अलावा, .view_paths अपने दोस्त तो अपने पटरियों में कोशिश सांत्वना निम्नलिखित है:

Devise::SessionsController.view_paths 
YourApp::SomeDeviseController.view_paths 

यह आपको जहां प्रत्येक नियंत्रक टेम्पलेट्स के लिए खोज कर रहा है का एक बेहतर विचार दे देंगे।

+0

मैं नियंत्रक को परिभाषित नहीं कर रहा हूं, मैं सिर्फ दृश्य को ओवरराइड करना चाहता हूं। अधिक विशेष रूप से मैं नियंत्रक को ओवरराइड किए बिना 'devise-2.1.0/app/views/devise/session/new.html.erb' में स्थित दृश्य को ओवरराइड करना चाहता हूं। क्या यह संभव है? –

+0

ओह .view_paths दिखाता है: डेविस :: सत्र नियंत्रक।view_paths => # <एक्शन व्यू :: पथसेट: 0x007fa1bf0e36f8 @ पथ = [/ उपयोगकर्ता/हानिकारक/ड्रॉपबॉक्स/कोड/परियोजनाओं/चमकदार/बीबीआर-ऑनलाइन/बीआरबी-ऑनलाइन-मणि/परीक्षण/डमी/ऐप/विचार,/उपयोगकर्ता/हानिकारक /। आरबीएनवी/संस्करण/1.9.2-पी 2 9 0/lib/ruby ​​/ रत्न/1.9.1/रत्न/devise-2.1.0/ऐप/विचार, /उपयोगकर्ता/हानिकारक/ड्रॉपबॉक्स/कोड/परियोजनाओं/चमकदार/bbr-online/bbr-online-gem/app/views] ब्रब्रोनलाइन :: सत्र नियंत्रक निश्चित रूप से मौजूद नहीं है, मैं इसे –

+1

ओवरराइड नहीं करता हूं यदि आप कस्टम नियंत्रक का उपयोग नहीं करना चाहते हैं, तो बस ओवरराइड करें देखें, बस अपना नया दृश्य यहां रखें: 'your-engine/app/views/devise/session/new.html.erb' और सुनिश्चित करें कि आपके माउंटेबल इंजन से पहले डेविस का इंजन लोड हो गया है (केवल पहले तैयार होना आवश्यक है)। फिर, अपने 'Devise.parent_controller' में'view_paths' को कॉल करना या आपके एप्लिकेशन नियंत्रक में आपको टेम्पलेट लुकअप ऑर्डर बताएगा। –

7

आप अपने lib \ my_engine \ engine.rb फ़ाइल के शीर्ष पर अपने इंजन, बस require 'devise' का उपयोग करता है हर ऐप्लिकेशन में config.railties_order समायोजित करने के लिए नहीं करना चाहते हैं।

+1

हाँ, यह काम किया! +1 – Ajedi32

+1

जबकि अन्य उत्तर view_paths की खोज करने के लिए अंतर्दृष्टि प्रदान करते हैं, यह उत्तर है यदि आपका इंजन अन्य इंजनों को लोड और अनुकूलित करने के लिए है – prusswan

+0

मेरी जान बचाई = डी –

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