gpt4 book ai didi

ruby-on-rails - Rails 模块作用域

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:57 26 4
gpt4 key购买 nike

给定以下 Controller 结构:

# 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 中所有 Controller 的声明,以专门针对 Admin::ApplicationController

# admin/pages_controller.rb
module Admin
class PagesController < Admin::ApplicationController; end
end

好的,但据我所知,它首先是正确的。为什么 Rails 有时会继承错误的 Controller ?

Admin::PagesController 有时 继承自 ApplicationController 而不是 Admin::ApplicationController 尽管两者都在相同的 module Admin

最佳答案

这里的问题是 rails 的开发模式代码加载:通常,当您尝试使用常量(例如它的子类)做某事并且该常量不存在时,代码就会被加载。这导致 const_missing 被调用,rails 使用它来尝试加载该类(有关详细说明,请参阅 the guide)。

如果 ApplicationController 和 Admin::ApplicationController 都不存在,那么当您访问您的管理页面时, Controller ruby​​ 将命中该 const_missing 并尝试加载 admin/application_controller.rb

但是,如果 ApplicationController 已经加载,则 ruby​​ 不会触发 const_missing,因为管理模块中的类从顶层继承是完全合法的。

如您所说,解决方案是明确说明您继承自什么。就我个人而言,在我自己的应用程序中,我使用 Admin::BaseController 作为基类。

关于ruby-on-rails - Rails 模块作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29641964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com