ruby-on-rails – Rails模块范围
给定以下控制器结构:
# application_controller.rb class ApplicationController < ActiveController::Base; end # pages_controller.rb class PagesController < ApplicationController; end # admin/application_controller.rb module Admin class ApplicationController < ::ApplicationController; end end # admin/pages_controller.rb module Admin class PagesController < ApplicationController; end end 人们可以期望Admin :: PagesController从Admin :: ApplicationController继承而且它确实如此.但我注意到有时它继承自:: ApplicationController. 因此,我决定不冒风险,并将/ admin中所有控制器的声明更改为专门针对Admin :: ApplicationController # admin/pages_controller.rb module Admin class PagesController < Admin::ApplicationController; end end 好的,但是从我知道它首先是正确的.为什么Rails有时会从错误的控制器继承? Admin :: PagesController有时继承自ApplicationController而不是Admin :: ApplicationController,尽管两者都在同一模块Admin中 解决方法
这里的问题是rails的开发模式代码加载:通常代码是在你尝试用常量做某事时加载的(例如,从它的子类)并且该常量不存在.这会导致调用const_missing,并且rails使用它来尝试加载类(有关详细说明,请参阅
the guide).
如果ApplicationController和Admin :: ApplicationController都不存在,那么当您访问管理页面控制器时,ruby将命中该const_missing并尝试加载admin / application_controller.rb 但是,如果已经加载了ApplicationController,那么ruby将不会触发const_missing,因为对于admin模块中的类来说,继承顶层的东西是完全合法的. 您所说的解决方案是明确您继承的内容.我个人在自己的应用程序中使用Admin :: BaseController作为基类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |