我应该在命名空间控制器中明确定义模块吗?

时间:2014-05-12 21:49:14

标签: ruby-on-rails ruby

我在Rails教程中看起来像这样的代码示例:

module Api
  class UsersController
    # ... 
  end
end

就像这样:

class Api::UsersController
  # ...
end

两个代码示例似乎都运行正常,即使RubyMine IDE给我一个警告,说明模块未在第二个示例中定义。你能解释一下吗?非常感谢

1 个答案:

答案 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