2016-03-30 8 views
5

मेरे नाम पर एक नियंत्रक स्पेस बनाने के दौरान एक अजीब समस्या है जब एक ही नाम के साथ एक वैश्विक नियंत्रक भी होता है।नेमस्पेस्ड कंट्रोलर पर रुपेक कंट्रोलर स्पेक उसी नाम के साथ वैश्विक नियंत्रक को पाता है

नियंत्रक नाम HomeController और Backend::HomeController हैं।

ध्यान दें कि मैं अभी तक नहीं बनाया है फ़ाइल app/controllers/backend/home_controller.rb, केवल वैश्विक नियंत्रक मौजूद app/controllers/home_controller.rb

इसलिए मैं परीक्षण त्रुटियों के साथ विस्फोट करने की उम्मीद है, लेकिन ऐसा नहीं है। यह सभी हरे और खुश हो जाता है।

मेरे कल्पना करता है, तो मैं कुछ और करने के लिए अपने वैश्विक HomeController में नाम बदलने के लिए, उदाहरण के लिए NotMyHomeController इस

#spec/controllers/backend/home_controller_spec.rb 
require 'rails_helper' 

RSpec.describe Backend::HomeController, type: :controller do 
    before do 
    user = FactoryGirl.create(:user) 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    allow(controller).to receive(:current_user).and_return(user) 
    end 
    describe "GET #index" do 
    it "returns http success" do 
     get :index 
     expect(response).to have_http_status(:success) 
    end 
    end 

end 

तरह लग रहा है हालांकि परीक्षण त्रुटियों कह

Unable to autoload constant HomeController, expected app/controllers/home_controller.rb to define it 

कौन सा मुझे उस पर शक करता है के साथ विफल Rspec.describe फ़ंक्शन में "बैकएंड" भाग से रूपेक परेशान नहीं है।

क्या मैं कुछ गलत कर रहा हूं या क्या मुझे कुछ और महत्वपूर्ण हिस्सा याद आ रहा है? आईएमएचओ, यह कल्पना पास नहीं होनी चाहिए (Gandalf को पारदर्शी करने के लिए)।

मैं रेल 4.2.6 का उपयोग कर रहा हूँ, Rspec-रेल 3.4.2

अद्यतन

मैक्स के रूप में बताया, यह शायद नहीं Rspec मुद्दे पर रेल autoloading के साथ कुछ है, लेकिन इसके बजाय।

हालांकि मैं सिर्फ

Backend::HomeController 

रेल कंसोल में टाइपिंग, लेकिन वहाँ मैं उम्मीद त्रुटि

NameError: uninitialized constant Backend::HomeController 

और according to the Rails guide, दोनों कंसोल और टेस्ट स्वीट autoloads पाने की कोशिश की। हालांकि मुझे लगता है कि मैं यहां सही रास्ते पर हूं।

+0

मैं मैं अनुमान लगा रहा हूं कि रेल ऑटोलोडर कुछ खराब कर रहा है - यह 'ऑब्जेक्ट.कॉन्स्ट_मसिंग' बंदरपैचिंग द्वारा काम करता है जो आमतौर पर 'नाम त्रुटि: अनियमित स्थिर बैकएंड :: होमकंट्रोलर' उठाता। आरएसपीसी के साथ यह बहुत कम है। – max

+0

मेरे लिए इसे साफ़ करने के लिए धन्यवाद। क्या आपके पास Rails Autoloader की जांच करने के बारे में कोई सुझाव है? –

+0

http://guides.rubyonrails.org/autoloading_and_reloading_constants.html – max

उत्तर

1

मैं इस एक ही समस्या थी पहले - आप पूरे मुद्दे के बारे में यहाँ पढ़ सकते हैं:

Object.const_get and Rails - cutting off parent module names

लेकिन जवाब का मांस उपयोगकर्ता Apneadiving से this जवाब से आता है:

Be aware that there are vicious cases in Rails development mode. In order to gain speed, the strict minimum is loaded. Then Rails looks for classes definitions when needed.

But this sometimes fails big time example, when you have say ::User already loaded, and then look for ::Admin::User . Rails would not look for it, it will think ::User does the trick.

This can be solved using require_dependency statements in your code.

+0

धन्यवाद! मैं अपने spec के शीर्ष में 'requ_dependency" # {:: Rails.root}/ऐप/नियंत्रक/बैकएंड/home_controller' जोड़ना समाप्त कर दिया और यह समस्या हल हो गई –

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