7

當首先加載全局應用程序控制器時,名稱空間應用程序控制器在加載該名稱空間內的頁面時不加載。應用控制器看起來是這樣的:Rails 3.2.3名稱空間控制器被具有相同名稱的全局控制器覆蓋

class ApplicationController < ActionController::Base 
protect_from_forgery 
end 

而命名空間中的應用控制器看起來是這樣的:「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 

「引用Admin :: AssetsController#new中的NoMethodError」。這隻發生在命名空間路由之前我們點擊全局路由時。如果服務器重新啓動並且命名空間路由首先被加載,那麼所有事情都可以正常工作。

+0

這些控制器在哪些文件? –

+0

app/controllers/admin/application_controller.rb, app/controllers/admin/assets_controller.rb和 app/controllers/application_controller.rb –

回答

9

這是發生,因爲你也碰巧有一個Admin模型(一類)具有相同的名稱作爲您的命名空間中的新動作。

This Google組線程提供了一個很好的解釋究竟發生了什麼。

要解決這個問題,我要麼將模型重命名爲AdminUser,要麼如果這不可能,重命名該命名空間也將解決該問題。

3

名稱空間控制器需要出現在正確的目錄結構中。

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

就個人而言,我會建議對一個命名空間中的基本控制器超載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中執行了操作,因爲它們看起來並不相關,所以我們沒有將它們放在原始文章中。 –

相關問題