0

我正在尝试在以下位置创建控制器:

app/controllers/admin/account/users_controller.rb

我的模型在:

app/models/account/user.rb

所需的表名是“account_users”。

如果我运行:

rails g scaffold account/user username:string

然后脚手架正确生成文件,一切正常。我现在将我的控制器和查看用户文件放入管理文件夹(我省略了视图,因为问题与控制器和模型有关):

scaffold generated: app/controllers/account/users_controller.rb 
relocated: app/controllers/admin/account/users_controller.rb

在控制器中,我必须修改以下内容:

scaffold generated:  class Account::UsersController < ApplicationController
modified:  class Admin::Account::UsersController < ApplicationController

我将路线更改为:

namespace :admin do
  namespace :account do
    resources :users
  end
end

到目前为止一切顺利,当我转到 localhost:3000/admin/account/users 时一切正常

我现在正试图干掉我的控制器,每个数据库调用都以“Account::”模块为前缀。它看起来像这样:

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

当我将控制器更改为:

class Admin::Account::UsersController < ApplicationController

  include Account

  def index
    @account_users = User.all
  end

我收到一条错误消息,说“用户”是一个未初始化的常量。我的第一个想法是找不到帐户模块。我的帐户模块如下所示(app/models/account.rb):

module Account
  def self.table_name_prefix
    'account_'
  end
end

我在这个模块中写了一些调试代码,它正在执行,所以看起来 Account 模块包含在控制器中。

我认为控制器没有识别“account_”前缀,并认为当我调用 User.all 时,它实际上是在寻找用户表而不是 account_users 表。

所以我的问题是,有谁知道在为模型和控制器使用不同的文件夹结构时是否可以在控制器中包含模块?

我正在使用 Rails 4.0 和 Ruby 2.0.0。如果有人可以提供帮助,谢谢!

4

2 回答 2

0

1-

您希望您的用户模型被命名User而不是生成的Account::User,您需要:

  • 在您的控制器和所有其他文件中替换Account::UserUser
  • 在您的用户模型中替换class Account::User < ActiveRecord::Baseclass User < ActiveRecord::Base
  • 将您的用户模型文件从 app/models/account/user.rb 移动到 app/models/user.rb
  • 重启你的 server/guard/zeus/console/etc... ,这可能没有必要,但有时更改不会被拾取并导致奇怪的问题

编辑:您的类名必须与目录结构相对应:User模型必须位于文件 models/user.rb 中;Account::User模型模型必须位于文件 models/account/user.rb 中,如果您不遵循此约定,您将遇到未初始化的常量错误,这就是附加给您的内容。

2-

您正在使用table_name_prefix,这是一种模型方法,而不是控制器方法。因此,您的模块Account不能包含在您的UsersController控制器中,而是包含在您的User模型中。

编辑毫无疑问table_name_prefix,它不是控制器方法,而是模型方法。所以你必须以某种方式将它放在你的模型中,你真的想使用一个模块吗?请参阅我的第 3 点。但我怀疑你的模块包含控制器方法,在这种情况下table_name_prefix,直接从模块中移出到你的模型中

http://apidock.com/rails/ActiveRecord/Base/table_name_prefix/class

3-

我怀疑您的模块Account是否正确编写,因此如果在完成所有操作后您的 table_prefix 仍然没有被 rails 看到,请尝试Account像这样修改您的模块:

module Account

  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def table_name_prefix
      'account_'
    end
  end

end
于 2013-08-02T23:00:54.163 回答
0

解决方案是将其添加到控制器的第 1 行

require 'account/user'
class Admin::Account::UsersController < ApplicationController

  include Account

  def index
    @account_users = User.all
  end
于 2013-08-11T04:20:41.650 回答