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

Cod*_*ith 6 ruby-on-rails rails-routing ruby-on-rails-4

我有一个名为的模型Organization.它的定义是app/models/organization.rb

class Organization < ActiveRecord::Base
... code
end
Run Code Online (Sandbox Code Playgroud)

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

class Admin::Organization::ActivitiesController < ApplicationController
  def index
    @organization = Organization.new
    ... more code
  end
end
Run Code Online (Sandbox Code Playgroud)

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

NameError in Admin::Organization::ActivitiesController#index
uninitialized constant Admin::Organization::ActivitiesController::Organization
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它在控制器类中确定了组织模型.如果我改变使用index方法

@organization = ::Organization.new
Run Code Online (Sandbox Code Playgroud)

然后它工作正常.

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

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

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

namespace :admin do
  namespace :organization
    resources :activities
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*man 2

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

# app/controllers/activities_controller.rb
class ActivitiesController < ApplicationController
  def index
    @organization = Organization.new
    ... more code
  end
end
Run Code Online (Sandbox Code Playgroud)

现在配置路由,

# config/routes.rb
scope 'admin/organization', path: 'admin/organization'  do
  resources :activities
end
Run Code Online (Sandbox Code Playgroud)

这将产生这样的路线,

Prefix Verb   URI    Pattern                                      Controller#Action

activities    GET    /admin/organization/activities(.:format)     activities#index
              POST   /admin/organization/activities(.:format)     activities#create
......
Run Code Online (Sandbox Code Playgroud)