2015-10-12 46 views
5

我有一個名爲Organization的模型。它在app/models/organization.rbRails NameError未初始化常量(模型和名稱空間碰撞)

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它工作正常。

應用程序中的每個其他模型都能正常工作,並且沒有這種奇怪的行爲。我最初沒有編寫代碼,所以我試圖弄清楚發生了什麼。

我認爲它可能與route.rb文件中的命名空間有關。有一個名稱空間使用organization字。

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

作爲測試,我改變了命名空間:organizations,我能得到的東西,而無需::工作。有沒有一種方法來組織結構或路由設置,所以我們可以有一個名稱空間:organization,它不會影響名爲Organization的模型?

+0

只是爲了澄清,當你說「的代碼休息」,你的意思是你看到當您嘗試啓動應用程序或調用'ActivitiesController#index'方法時出錯? – seddy

+0

執行'ActivitiesController#index'動作時會中斷。我更新了這個問題。 – CodeSmith

回答

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 
...... 
相關問題