在为模型使用不同的文件夹结构时,在控制器中包含模块?

时间:2013-08-02 21:29:53

标签: ruby-on-rails ruby-on-rails-4

我正在尝试创建一个控制器:

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。谢谢,如果有人可以提供帮助!

2 个答案:

答案 0 :(得分:0)

1 -

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

  • Account::User
  • 中替换您的控制器和所有其他文件User
  • 通过class Account::User < ActiveRecord::Base
  • 替换您的用户模型class User < ActiveRecord::Base
  • 将您的用户模型文件从app / models / account / user.rb移至app / models / user.rb
  • 重新启动你的服务器/ guard / zeus / console / etc ......,这可能没有必要,但有时候没有接收到更改并导致奇怪的问题

编辑:您的类名必须与目录结构相对应:User模型必须位于文件models / user.rb中; Account::User模型模型必须位于文件模型/ 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,请尝试修改模块Account,如下所示:

module Account

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

  module ClassMethods
    def table_name_prefix
      'account_'
    end
  end

end

答案 1 :(得分:0)

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

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

  include Account

  def index
    @account_users = User.all
  end