2015-10-12 16 views
5

Mam model o nazwie Organization. Jest ona definiowana w app/models/organization.rbRails Niepowitanie stałej NameError (kolizja modelu i przestrzeni nazw)

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

Mam kontroler o nazwie Admin::Organization::ActivitiesController. Jest zdefiniowany w app/controllers/admin/organization/activities_controller.rb. Ma w sobie akcję indeksowania.

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

pojawia się następujący komunikat kiedy wykonać powyższą akcję index:

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

Z jakiegoś powodu to SCOPINGU model organizacyjny wewnątrz klasy kontrolera. Jeśli zmienię metodę , aby można było używać tej metody, to można ją poprawnie.

To zachowanie nie pojawia się w konsoli podrzędnej. Jeśli dodam wywołanie binding.pry w metodzie indeksu, mogę wywołać Organization.new lub ::Organization.new z wiersza poleceń, który działa poprawnie.

Każdy inny model w aplikacji działa poprawnie i nie ma tego dziwnego zachowania. Nie napisałem oryginalnego kodu, więc staram się rozgryźć, co się dzieje.

Myślę, że może to mieć coś wspólnego z przestrzenią nazw w pliku routes.rb. Istnieje przestrzeń nazw korzystająca ze słowa organization.

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

Jako test, zmieniłem nazw do :organizations, i udało mi się dostać rzeczy do pracy bez konieczności ::. Czy istnieje sposób na uporządkowanie rzeczy lub ustawienie routingu, abyśmy mogli mieć przestrzeń nazw :organization, która nie koliduje z modelem o nazwie Organization?

+0

Właśnie w celu wyjaśnienia, kiedy mówisz "przerwy kod", to znaczy, że widać, że błąd podczas próby uruchomienia aplikacji lub wywołania metody 'ActivityController # index'? – seddy

+0

Pęknie, gdy zostanie wykonane działanie 'ActivityController # index'. Zaktualizowałem pytanie. – CodeSmith

Odpowiedz

1

Jeśli chcesz, aby ścieżka była prawidłowa, nie musisz umieszczać kontrolera działań pod folderem nazw obszaru admin/organization. Inną opcją byłoby użycie zakresu zamiast przestrzeni nazw.

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

teraz skonfigurować trasy,

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

To będzie produkować trasy w ten sposób,

Prefix Verb URI Pattern          Controller#Action 

activities GET /admin/organization/activities(.:format)  activities#index 
       POST /admin/organization/activities(.:format)  activities#create 
...... 
Powiązane problemy