【发布时间】:2018-03-30 09:04:00
【问题描述】:
这里是a brand new Rails 5.1.4 app,带有一个模型和几个路由和控制器。
命名空间控制器正在引用顶级模型:
class AdminArea::WelcomeController < ApplicationController
def index
@user = User.new(name: 'Sergio')
end
end
到目前为止一切顺利。您可以查看 master,导航到 http://localhost:3000/admin_area/welcome 并查看它是否有效。
但是如果我们were to add an empty directory app/presenters/admin_area/user/ *,那么事情就会变得很奇怪。突然之间,那个控制器中的User 不是我的模型,而是一个不存在的模块!
NoMethodError (undefined method `new' for AdminArea::User:Module):
app/controllers/admin_area/welcome_controller.rb:3:in `index'
当然,这个模块没有任何[非内置]方法,也不能固定到磁盘上的源文件。
问题:为什么添加一个空目录会导致 Rails 神秘地凭空变出一个模块,而不是正确地将名称 User 解析为我的模型?
* 实际上,如果你按原样检查那个分支,你会得到一个不同的错误。
NameError(未初始化的常量 AdminArea::WelcomeController::User)
因为 git 不允许我提交一个空目录,所以我在其中添加了一个 .keep 文件。但是,一旦您删除该文件,您就会得到上述行为。
【问题讨论】:
-
@jon1467:不,不是那个副本。除非我错过了什么。
-
对不起,我想我误读了您的问题,询问如何将您的用户模型放在目录
presenters中。我的错。 -
我认为this issue 可以描述您的问题,但没有迹象表明这是否已修复/更改。
-
@jon1467:更接近,但仍然没有。
Module.nesting不影响这里的事情。在示例应用程序中它是AdminArea::WelcomeController,但在我的实际应用程序中,它是一个正确的嵌套 (module AdminArea; class WelcomeController)。两者都表现出相同的行为。
标签: ruby-on-rails