Rails 3命名空间需要模型定义两次?

时间:2011-02-11 07:14:06

标签: ruby-on-rails-3 namespaces models

我正在试图理解Rails 3中的命名空间。我尝试了几个不同的教程,我可以让我的模型工作的唯一方法是在基本目录中定义我的模型和我的命名空间目录。

如果我只在命名空间目录中定义模型,它希望它定义Model和Namespace :: Model,如下所示:

LoadError (Expected .../app/models/plugins/chat.rb to define Chat):

LoadError (Expected .../app/models/plugins/chat.rb to define Plugins::Chat):

我确定我错过了一些明显的东西,但我确实可以在正确的方向上使用指针。 以下是相关的摘录。

/models/plugins/chat.rb

class Plugins::Chat
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming
...
end

/controllers/plugins/chats_controller.rb

class Plugins::ChatsController < Plugins::ApplicationController
load_and_authorize_resource
...  
end

/config/routes.rb

namespace :plugins do 
  resources :chats
end

/config/application.rb

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

修改 的 这是与CanCan的某种不良交互,CanCan是我们用于权限的宝石。 load_and_authorize_resource行在某种程度上是错误的。会继续挖掘...

2 个答案:

答案 0 :(得分:2)

我注意到控制器中有load_and_authorize_resource的引用。 CanCan gem使用此方法创建模型的实例,然后测试用户是否可以访问它。如果您使用的是命名空间模型,则需要指定类:

class Plugins::ChatsController < Plugins::ApplicationController
load_and_authorize_resource :class "Plugins::Chat"
...  
end

答案 1 :(得分:0)

听起来好像在某些时候你在加载之前引用了Chat常量\。然后Rails试图通过查看models/chat.rb找到它,找不到它,并抱怨。检查你的常量用法(回溯应该告诉你从哪里调用它),并清理它,Rails应该少抱怨。