web-dev-qa-db-de.com

Nicht initialisierte Konstante "Controller Name"

Ich habe einen Fehler mit meinen Routen/Ressourcen und Controllern.

Ich habe folgendes in der route.rb:

# routes.rb
resources :users do  
  resource :schedule  
end

Und ich habe eine schedule_controller.rb in Controllern/Benutzern/so eingerichtet, wie ich denke, es sollte sein:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end

Einen Rechen ausführen: Routenshows 

user_schedule      POST   /users/:user_id/schedule(.:format)       schedules#create
new_user_schedule  GET    /users/:user_id/schedule/new(.:format)   schedules#new
edit_user_schedule GET    /users/:user_id/schedule/edit(.:format)  schedules#edit
                   GET    /users/:user_id/schedule(.:format)       schedules#show
                   PUT    /users/:user_id/schedule(.:format)       schedules#update

Wenn Sie zu/users /: user_id/schedule navigieren, wird der folgende Fehler zurückgegeben:

uninitialized constant SchedulesController

Meine einzige Überlegung, was das Problem sein könnte, ist etwas mit verschachtelten Ressourcen oder dem Deklarieren einer einzelnen Ressource zu tun, und ich gehe irgendwo falsch.

Ich benutze den Helfer 

new_user_schedule_path(current_user)

beim Linken zu meiner "neuen" Ansicht.

15
Adam

Es sollte SchedulesController sein, nicht Users::ScheduleController. Controller sollten nur dann einen Namensraum haben, wenn die Route Namensbereich mit namespace ist. Controller-Namen sollten auch immer Plural sein.

Was Sie erstellen, ist eine nested - Ressource , keine Namespaces.

15
Andrew Marshall

Ist der Namensraum des SchedulesController beabsichtigt? d.h. meinst du wirklich dies zu tun?

class Users::SchedulesController < ApplicationController

Oder machst du das nur, weil Zeitpläne eine "Untersache" von Benutzern sind?

Ich frage dies, weil verschachtelte Ressourcencontroller in Rails normalerweise keinen Namensraum haben. Sie würden einen Controller nur dann mit einem Namespace versehen, wenn Sie die Controller unter einem Namespace auf besondere Weise ändern möchten. Ein häufiges Beispiel hierfür ist, dass einige Controller unter einem Administrator-Namespace stehen und von einem BaseController in diesem Namespace erben, wodurch nur Administratoren daran gehindert werden, auf diese Controller zuzugreifen.

Option 1

Wenn Sie diesen Controller nicht absichtlich mit einem Namespace versehen haben, möchten Sie das Users:: -Präfix von Ihrem Controller entfernen und es zurück in app/controllers/schedules_controller.rb verschieben Helfer zurück zu app/helpers/schedules_helper.rb und die Ansichten zurück zu app/views/schedules. Möglicherweise haben Sie einen Generator ausgeführt, der auch ein Users::Schedule -Modell generiert hat, das ebenfalls in Schedule umbenannt und zurück in app/models/schedule.rb verschoben werden muss.

Option 2

Wenn Sie diesen Controller absichtlich mit einem Namensraum versehen haben, möchten Sie dies auf Ihren Routen tun:

namespace :users do
  resources :schedules
end

Lassen Sie alles, was generiert wurde, so, wie es sein sollte.

3
Ryan Bigg

In Ihrer routes.rb müssen Sie den Controller folgendermaßen angeben:

resources :users do resource :schedules, controller: 'users/shedules' end

1
Pshemski

ressourcen ersetzen: Benutzer in Namespace: Benutzer

Ihr Zeitplan-Controller befindet sich im Benutzerordner . Class Users :: ScheduleController <ApplicationController # Controller-Methoden hier ... Ende

0
Hemant Kumar