我在Rails教程中看起来像这样的代码示例:
module Api
class UsersController
# ...
end
end
就像这样:
class Api::UsersController
# ...
end
两个代码示例似乎都运行正常,即使RubyMine IDE给我一个警告,说明模块未在第二个示例中定义。你能解释一下吗?非常感谢
答案 0 :(得分:1)
两个代码片段都会声明一个带有UsersController的模块Api。
然而,声明之间的区别在于,在第一个片段中,词法范围设置为Api模块。我们假设你有一个班级Api::User
。在第一个代码段中,您可以省略模块:
module Api
class UsersController
def action
@user = User.first # #<Api::User>
end
end
end
由于词法范围设置为Api模块,因此Ruby也首先搜索该类。
但是,在第二个片段中,您需要明确说明命名空间,否则它可能无法解析常量:
class Api::UsersController
def action
@user = User.first # #<NameError: uninitialized constant User>
end
end
另请参阅描述同一问题的this blog post。