导轨3.2.3命名空间的控制器是由具有相同名称的全球覆盖控制器(Rails 3.2.3 namesp

2019-09-17 19:25发布

当全球应用控制器第一次加载,加​​载该命名空间中的网页时,命名空间中的应用控制器不加载。 应用控制器看起来是这样的:

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

A “NoMethodError在管理:: AssetsController#新的” 被抛出。 这只有当我们的命名空间的路线前冲击全球路线发生。 如果服务器重新启动,并且命名空间的路径首先加载一切正常。

Answer 1:

这是发生,因为你也碰巧有一个Admin模型(一类)具有相同名称的命名空间。

这个谷歌组线程提供究竟正在发生的一个很好的解释。

要解决,我要么重新命名模型来AdminUser ,或者如果这不是一个可能性,重命名命名空间也将解决这个问题。



Answer 2:

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

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


文章来源: Rails 3.2.3 namespaced controllers being overridden by global controllers with same name