2015-10-12 9 views
5

Ich habe ein Modell mit dem Namen Organization. Es wird definiert, in app/models/organization.rbRails NameError nicht initialisierte Konstante (Model und Namespace Collision)

class Organization < ActiveRecord::Base 
... code 
end 

Ich habe einen Controller namens Admin::Organization::ActivitiesController. Es ist definiert in app/controllers/admin/organization/activities_controller.rb. Es hat eine Indexaktion darin.

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

bekomme ich folgende Meldung, wenn ich die oben Index Aktion ausführen:

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

Aus irgendeinem Grund es Scoping das Organisationsmodell innerhalb der Controller-Klasse. Wenn ich die index Methode ändern

@organization = ::Organization.new 

zu verwenden, dann funktioniert es gut.

Dieses Verhalten scheint nicht in einer Pry-Konsole angezeigt. Wenn ich einen binding.pry Aufruf in der Indexmethode hinzufüge, dann kann ich Organization.new oder ::Organization.new von der Befehlszeile aufrufen, es funktioniert gut.

Jedes andere Modell in der App funktioniert ordnungsgemäß und hat dieses seltsame Verhalten nicht. Ich habe den Code ursprünglich nicht geschrieben, also versuche ich herauszufinden, was los ist.

Ich denke, es könnte etwas mit einem Namespace in der Datei routes.rb tun. Es gibt einen Namensraum, der das organization Wort verwendet.

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

Als Test, änderte es den Namespace :organizations, und ich war in der Lage, Dinge zu bekommen, ohne :: um zu arbeiten. Gibt es eine Möglichkeit, Dinge zu strukturieren, oder eine Routing-Einstellung, so dass wir einen Namensraum von :organization haben können, der das Modell mit dem Namen Organization nicht stört?

+0

Nur um zu klären, wenn Sie "den Code breaks" sagen, meinen Sie Sie sehen, dass Fehler, wenn Sie versuchen, die App zu starten oder wenn Sie die Methode 'ActivitiesController # index' aufrufen? – seddy

+0

Es bricht ab, wenn die Aktion 'ActivitiesController # index' ausgeführt wird. Ich habe die Frage aktualisiert. – CodeSmith

Antwort

1

Wenn Sie nur den Pfad korrigieren möchten, müssen Sie den Aktivitätscontroller nicht unter admin/organization Namespace-Ordner setzen. Eine andere Option wäre die Verwendung von Scope anstelle von Namespace.

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

konfigurieren Jetzt Routen,

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

Dies Routen wie diese produzieren,

Prefix Verb URI Pattern          Controller#Action 

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