我正在尝试创建一个控制器:
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。谢谢,如果有人可以提供帮助!
答案 0 :(得分:0)
1 -
您希望将您的用户模型命名为User
而不是生成的Account::User
,您需要:
Account::User
User
class Account::User < ActiveRecord::Base
class User < ActiveRecord::Base
编辑:您的类名必须与目录结构相对应: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