如何在控制器中包含模块?

时间:2013-08-04 19:19:25

标签: ruby-on-rails

如果我这样做:

rails generate scaffold account/user username

我得到一个看起来像这样的控制器:

class Account::UsersController < ApplicationController
  def index
    @account_users = Account::User.all
  end
...
end

如果我包含帐户模块,那么看起来所有数据库调用都不需要以“Account ::”作为前缀。即。

class Account::UsersController < ApplicationController

  include Account

  def index
    @account_users = User.all #this works because I included the Account Module above
  end
...
end

现在,如果我要移动我的

控制器/帐户/ users_controller.rb

文件到:

控制器/ 管理 /account/users_controller.rb

该文件看起来像这样(注意:此次移动后我也更正了我的路线文件):

class Admin::Account::UsersController < ApplicationController

  include Account

  def index
    @account_users = User.all #this call does not work now
  end
...
end

但是我收到一个错误,说“未初始化的常量Admin :: Account :: UsersController :: User”

看起来rails试图在“User”模型上进行数据库调用,而前面没有“Account ::”模块。

那么控制器中包含模块的工作原理如何?当我将控制器移动到另一个文件(并将模型保留在生成的脚手架中的相同位置)时,为什么这不起作用,但它适用于脚手架生成的文件?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

解析模块的名称是相对于当前模块完成的。尝试将其更改为:

include ::Account

include ::Admin::Account

(取决于定义用户模型的模块)

这将告诉ruby查看模块Account

的全局命名空间

答案 1 :(得分:0)

我想我没有意识到你可以明确要求你想要包含的模块的路径。我在阅读了更多模块之后了解到了这一点......

因此,在控制器类之外添加对“require'county / user'”的显式调用会使控制器中的模块包含在内。