加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails模块范围

发布时间:2020-12-17 03:18:00 所属栏目:百科 来源:网络整理
导读:给定以下控制器结构: # application_controller.rbclass ApplicationController ActiveController::Base; end# pages_controller.rbclass PagesController ApplicationController; end# admin/application_controller.rbmodule Admin class ApplicationCont
给定以下控制器结构:

# 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作为基类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读