gpt4 book ai didi

ruby-on-rails - Rails 的自动加载/恒定分辨率正在创建幽灵模块

转载 作者:行者123 更新时间:2023-12-04 11:44:27 27 4
gpt4 key购买 nike

这里是 a brand new Rails 5.1.4 app ,带有一个模型和几个路由和 Controller 。

命名空间 Controller 正在引用顶级模型:

class AdminArea::WelcomeController < ApplicationController
def index
@user = User.new(name: 'Sergio')
end
end

到现在为止还挺好。您可以查看大师,导航到 http://localhost:3000/admin_area/welcome并看到它的工作。

但是如果我们 were to add an empty directory app/presenters/admin_area/user/ * ,然后事情变得很奇怪。突然间, User那个 Controller 不是我的模型,而是一个不存在的模块!
NoMethodError (undefined method `new' for AdminArea::User:Module):

app/controllers/admin_area/welcome_controller.rb:3:in `index'

自然地,这个模块没有任何 [非内置] 方法并且不能固定到磁盘上的源文件。

问题 :为什么添加一个空目录会导致 Rails 神秘地凭空变出一个模块,而不是正确解析名称 User我的模型?

* 实际上,如果您按原样检查该分支,您会得到一个不同的错误。

NameError (uninitialized constant AdminArea::WelcomeController::User)



因为 git 不允许我提交一个空目录,所以我添加了一个 .keep文件在那里。但是,一旦您删除该文件,您就会得到上述行为。

最佳答案

这是 ruby​​ 常量查找和 Rails 如何解决自动加载的结果。

常数 User在 Controller 中被称为 "relative reference" ,这意味着它应该相对于它出现的命名空间进行解析。
对于此常量,可以定义常量的三种可能变体:

AdminArea::WelcomeController::User
AdminArea::User
User

Rails 自动加载将这些常量映射到文件名并遍历 autoload_path s 以便找到定义常量的文件。例如。:
app/assets/admin_area/welcome_controller/user.rb
app/assets/admin_area/welcome_controller/user
app/channels/admin_area/welcome_controller/user.rb
...
app/assets/admin_area/user.rb
app/assets/admin_area/user
...
app/assets/user.rb
...
app/models/user.rb #=> here it is!

当您添加 admin_area/user文件夹进入presenters目录,你实际上是在定义这样一个常量。 Modules in Rails are automagically created ,因此您实际上不需要创建文件来定义这些仅用作命名空间的模块。

添加文件夹时,该文件夹出现在 Rails 查找中:
...
app/assets/admin_area/user.rb
app/assets/admin_area/user
...
app/presenters/admin_area/user #=> Here Rails finds the folder

Rails 解决了 User引用该模块。

然而,这很容易解决,如果你想要 User AdminArea 中使用的常数命名空间来引用顶级常量(而不是 AdminArea::User 模块),您应该将“相对引用”更改为 绝对引用 通过在常量前面加上 :: .
@user = ::User.new(name: 'Sergio')

关于ruby-on-rails - Rails 的自动加载/恒定分辨率正在创建幽灵模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46811026/

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