7

जब वैश्विक एप्लिकेशन नियंत्रक पहले लोड होता है, तो नेमस्पेस एप्लिकेशन नियंत्रक उस नामस्थान के भीतर पृष्ठों को लोड करते समय लोड नहीं होता है। आवेदन नियंत्रक इस तरह दिखता है:रेल 3.2.3 नाम नियंत्रक नियंत्रकों को उसी नाम के साथ वैश्विक नियंत्रकों द्वारा ओवरराइड किया जा रहा है

class ApplicationController < ActionController::Base 
protect_from_forgery 
end 

और namespaced आवेदन नियंत्रक इस तरह दिखता है: "authenticate_admin"

class Admin::ApplicationController < ApplicationController 

def authenticate_admin! 
if current_admin.nil? 
    redirect_to new_admin_session_url 
end 
end 

private 

def current_admin 
    @current_admin ||= Admin.find(session[:admin_id]) if session[:admin_id] 
end 

helper_method :current_admin 
end 

जब हम before_filter का उपयोग इस तरह:

class Admin::AssetsController < Admin::ApplicationController 
    before_filter :authenticate_admin! 
end 

एक "व्यवस्थापक में NoMethodError :: AssetsController # नया" फेंक दिया है। यह तब होता है जब हम नामित मार्ग से पहले वैश्विक मार्ग पर पहुंचते हैं। यदि सर्वर पुनरारंभ होता है और नामित मार्ग लोड होता है तो पहले सब ठीक से काम करता है।

+0

इन नियंत्रकों में कौन सी फाइलें हैं? –

+0

ऐप/नियंत्रक/व्यवस्थापक/application_controller.rb, ऐप/नियंत्रक/व्यवस्थापक/assets_controller.rb और ऐप/नियंत्रक/application_controller.rb –

उत्तर

9

इसका कारण यह है कि आप भी एक Admin मॉडल (एक कक्षा) अपने नाम स्थान के रूप में एक ही नाम के साथ हैं तो आप क्या हो रहा है पर नया कार्य निर्धारित।

This Google समूह धागा वास्तव में क्या हो रहा है इसका एक अच्छा स्पष्टीकरण प्रदान करता है।

ठीक करने के लिए, मैं मॉडल को AdminUser पर नाम दूंगा या यदि यह संभावना नहीं है, तो नामस्थान का नाम बदलने से भी समस्या ठीक हो जाएगी।

3

नामांकित नियंत्रकों को सही निर्देशिका संरचना में प्रकट होने की आवश्यकता है।

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

व्यक्तिगत रूप से, मैं एक namespaced आधार नियंत्रक के लिए ApplicationController नाम ओवरलोडिंग के खिलाफ सलाह देंगे। इससे समस्या नहीं आती है लेकिन यह वरीयता का मामला है - केवल एक ही आवेदन है, और केवल एक ApplicationController होना चाहिए। यदि आप Admin नामस्थान का उद्देश्य हैं तो आप ContentManagementController का उपयोग कर सकते हैं।

दूसरा, यह इस तरह से module कीवर्ड अपने नियंत्रकों का उपयोग करें और परिभाषित करने के लिए बेहतर अभ्यास है:

module Admin 
    class ContentManagementController < ApplicationController 
     # .. 
    end 
end 

# app/controllers/admin/content_management_controller.rb 

संपादित करें: मैं भी सिर्फ विशिष्ट त्रुटि (? शायद अपने प्रश्न अद्यतन किया गया था) देखा - आप की जरूरत है AssetsController

def new 
    # 
end 
+0

क्षमा करें मैंने पहले इसका उल्लेख नहीं किया था; नियंत्रक सही निर्देशिका संरचना में हैं, जैसा कि आपने कहा था। हमारे पास AssetsController में कार्रवाइयां हैं, हमने उन्हें मूल पोस्ट में नहीं रखा क्योंकि यह प्रासंगिक प्रतीत नहीं हुआ था। –

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