7

当首先加载全局应用程序控制器时,在该命名空间内加载页面时,命名空间应用程序控制器不会加载。应用程序控制器如下所示:

class ApplicationController < ActionController::Base
 protect_from_forgery
end

命名空间的应用程序控制器如下所示:

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 "authenticate_admin!" 像这样:

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

抛出“Admin::AssetsController#new 中的 NoMethodError”。这只发生在我们在命名空间路由之前点击全局路由时。如果服务器重新启动并首先加载命名空间路由,则一切正常。

4

2 回答 2

9

发生这种情况是因为您也碰巧有一个Admin与您的命名空间同名的模型(一个类)。

这个谷歌组线程很好地解释了到底发生了什么。

要解决此问题,我会将模型重命名为,AdminUser或者如果不可能,重命名命名空间也将解决问题。

于 2012-06-05T18:41:58.300 回答
3

命名空间控制器需要出现在正确的目录结构中。

app/controllers/admin/application_controller.rb

app/controllers/admin/assets_controller.rb

就个人而言,我建议不要重载ApplicationController命名空间基本控制器的名称。这不会导致问题,但这是一个偏好问题 - 只有一个应用程序,并且应该只有一个ApplicationController. ContentManagementController如果这是命名空间的目的,您可以使用Admin

其次,更好的做法是使用module关键字并以这种方式定义控制器:

module Admin
  class ContentManagementController < ApplicationController
      # ..
  end
end

# app/controllers/admin/content_management_controller.rb

编辑:我也刚刚看到了具体错误(也许您的问题已更新?)-您需要在AssetsController

def new
   #
end
于 2012-06-05T17:55:00.460 回答