Rails NameError未初始化的常量(模型和命名空间碰撞)

时间:2015-10-12 20:21:59

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

我有一个名为Organization的模型。它在app/models/organization.rb

中定义
class Organization < ActiveRecord::Base
... code
end

我有一个名为Admin::Organization::ActivitiesController的控制器。它在app/controllers/admin/organization/activities_controller.rb中定义。它中有一个索引动作。

class Admin::Organization::ActivitiesController < ApplicationController
  def index
    @organization = Organization.new
    ... more code
  end
end

执行上述索引操作时,我收到以下消息:

NameError in Admin::Organization::ActivitiesController#index
uninitialized constant Admin::Organization::ActivitiesController::Organization

由于某种原因,它在控制器类中确定了组织模型的范围。如果我更改index方法以使用

@organization = ::Organization.new

然后它工作正常。

此行为似乎不会出现在pry控制台中。如果我在索引方法中添加binding.pry调用,那么我可以从命令行调用Organization.new::Organization.new它可以正常工作。

应用程序中的每个其他模型都能正常工作,并且没有这种奇怪的行为。我原本没有编写代码,所以我试图弄清楚发生了什么。

我认为它可能与routes.rb文件中的命名空间有关。有一个使用organization字的命名空间。

namespace :admin do
  namespace :organization
    resources :activities
  end
end

作为测试,我将命名空间更改为:organizations,并且我能够在不需要::的情况下完成工作。有没有办法构建事物或路由设置,所以我们可以有:organization的名称空间不会干扰名为Organization的模型?

1 个答案:

答案 0 :(得分:1)

如果您只想使路径正确,则不需要将活动控制器放在admin/organization命名空间文件夹下。另一个选择是使用范围而不是命名空间。

# app/controllers/activities_controller.rb
class ActivitiesController < ApplicationController
  def index
    @organization = Organization.new
    ... more code
  end
end

现在配置路由,

# config/routes.rb
scope 'admin/organization', path: 'admin/organization'  do
  resources :activities
end

这会产生这样的路线,

Prefix Verb   URI    Pattern                                      Controller#Action

activities    GET    /admin/organization/activities(.:format)     activities#index
              POST   /admin/organization/activities(.:format)     activities#create
......