Constanta neinițializată „Controller Name” (Programare, Ruby Pe Șine, Ruby, Ruby On Rails 3.2)

Adam a intrebat.

Am o eroare cu rutele/resursele și controlorii mei.

Am următoarele în routes.rb:

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

Și am un schedule_controller.rb în interiorul controllers/users/ configurat așa cum cred că ar trebui să fie:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end

Rularea unui rake:routes arată

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

Cu toate acestea, navigarea către /users/:user_id/schedule returnează următoarea eroare:

uninitialized constant SchedulesController

Singurele mele gânduri cu privire la ceea ce ar putea fi problema sunt că are ceva de-a face cu resursele imbricate sau cu declararea unei singure resurse și că eu greșesc undeva.

Folosesc helper-ul

new_user_schedule_path(current_user)

atunci când fac legătura cu „noua” mea vizualizare.

Comentarii

  • Observați că ScheduleController nu este SchedulesController. –  > Por matt.
  • Am ajuns la această întrebare căutând eroarea din titlu, dar fără a avea imbricate vs namespaced resurse. În cazul meu fișierul controler nu a fost plasat în folderul corect. –  > Por stralsi.
  • În cazul meu, numele fișierului controlerului nu era în formatul corect. Numele fișierului ar trebui să fie „schedules_controller.rb” –  > Por amayer171292591.
4 răspunsuri
Andrew Marshall

Ar trebui să fie SchedulesController, , nu Users::ScheduleController. Controlorii ar trebui să fie namespaced numai atunci când traseul este namespaced cu namespace. De asemenea, numele controlorilor trebuie să fie întotdeauna la plural.

Ceea ce creați este un imbricate resursa, și nu una cu nume.

Comentarii

  • Exemplul de resursă la singular din ghid de rutare are un nume de clasă la plural, așa că mă aștept ca Andrew să aibă dreptate, iar numele controlerului tău să fie la plural. –  > Por Jared Beck.
  • Uneori, pluralul este greșit, în special în cazul pluralului complex sau al cuvintelor compuse. În aceste cazuri, puteți modifica fișierul inflections.rb astfel încât rails să caute „pluralul”. –  > Por Tsagadai.
  • Vă mulțumim pentru răspuns. Într-adevăr, am confundat resursele imbricate și namespacing. De asemenea, utilizarea unui „program” la singular a cauzat, de asemenea, probleme. –  > Por Adam.
Ryan Bigg

Este namespacing-ul din SchedulesController intenționată? într-adevăr intenționați să faceți acest lucru?

class Users::SchedulesController < ApplicationController

Sau faceți asta doar pentru că programele sunt un „sub-catârg” de la utilizatori?

Motivul pentru care întreb acest lucru este pentru că, de obicei, în cadrul Rails, controlorii de resurse imbricate nu sunt nu sunt spațiate prin nume. Ați numi un controler namespace doar dacă ați dori să modificați controlorii într-un mod special sub un namespace. Un exemplu obișnuit ar fi acela de a avea niște controlori sub un namespace de administrare, care moștenesc de la un controler BaseController în cadrul acelui spațiu de nume, care ar restricționa accesul numai pentru administratori la acei controlori.

Opțiunea 1

În cazul în care nu ați intenționat namespace acest controler, atunci doriți să eliminați Users:: din controlerul dvs. și mutați-l înapoi la app/controllers/schedules_controller.rb, și ajutoarele înapoi la app/helpers/schedules_helper.rb iar vizualizările înapoi la app/views/schedules. Poate că ați rulat un generator care a generat, de asemenea, un Users::Schedule care, de asemenea, ar trebui să fie redenumit în Schedule și mutat înapoi la app/models/schedule.rb.

Opțiunea 2

În cazul în care ați făcut-o intenționat namespace acest controler, atunci doriți să faceți acest lucru în rutele dumneavoastră:

namespace :users do
  resources :schedules
end

Lăsați tot ceea ce a fost generat așa cum ar trebui să fie.

Pshemski

În routes.rb trebuie să specificați controlerul în felul următor:

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

Comentarii

  • Acesta ar trebui să fie răspunsul acceptat, deoarece se pare că solicitarea inițială a fost pentru o resursă imbricata – nu una cu spațiu de nume. Dacă nu specificați controlerul în resursa imbricata, așa cum s-a făcut aici, veți primi eroarea pe care a întâlnit-o autorul original. –  > Por colemerrick.
Hemant Kumar

înlocuiți resursele :users cu namespace :users

Deoarece controlerul de planificare este în interiorul folderului users.class Users::ScheduleController < ApplicationController # Metodele controlerului aici…end