Исключение маршрутизации Rails для вложенных неглубоких маршрутов: 1 работает, 1 нет

Я регулярно использую неглубокие маршруты на вложенные ресурсы, поэтому подумал, что пропустил что-то простое, но не понимаю, почему Я получаю сообщение об ошибке маршрутизации для students#show.

У меня есть школа с двумя вложенными ресурсами: курсы и студенты. Все действия работают на курсах. Действия :index, :new и :create работают для студентов.

Почему я получаю сообщение об ошибке маршрутизации для /students/3 вместо маршрутизации на students#show, как указано в rake routes?

исключение на /students/3 :

Routing Error
No route matches {:controller=>"students"}

Try running rake routes for more information on available routes.

Вот соответствующие биты ...

вывод рейк-маршрутов:

...
            school_students GET    /schools/:school_id/students(.:format)     students#index
                            POST   /schools/:school_id/students(.:format)     students#create
         new_school_student GET    /schools/:school_id/students/new(.:format) students#new
               edit_student GET    /students/:id/edit(.:format)               students#edit
                    student GET    /students/:id(.:format)                    students#show
                            PUT    /students/:id(.:format)                    students#update
                            DELETE /students/:id(.:format)                    students#destroy
             approve_course GET    /courses/:id/approve(.:format)             courses#approve
             publish_course GET    /courses/:id/publish(.:format)             courses#publish
             school_courses GET    /schools/:school_id/courses(.:format)      courses#index
                            POST   /schools/:school_id/courses(.:format)      courses#create
          new_school_course GET    /schools/:school_id/courses/new(.:format)  courses#new
                edit_course GET    /courses/:id/edit(.:format)                courses#edit
                     course GET    /courses/:id(.:format)                     courses#show
                            PUT    /courses/:id(.:format)                     courses#update
                            DELETE /courses/:id(.:format)                     courses#destroy
                    schools GET    /schools(.:format)                         schools#index
                            POST   /schools(.:format)                         schools#create
                 new_school GET    /schools/new(.:format)                     schools#new
                edit_school GET    /schools/:id/edit(.:format)                schools#edit
                     school GET    /schools/:id(.:format)                     schools#show
                            PUT    /schools/:id(.:format)                     schools#update
                            DELETE /schools/:id(.:format)                     schools#destroy
...

маршруты.rb

Lms::Application.routes.draw do
...
resources :schools, :shallow => true do
  resources :students
  resources :courses do         # Courses still work if I remove this block.
    member do
      get 'approve'
      get 'publish'
    end
  end
end
...

контроллеры и представления

Я проверил, но, поскольку это исключение маршрутизации, я не думаю, что этот код достигнут. Если вы скажете мне иначе, я могу добавить их.

библиотеки

Я использую cancan с authlogic, но никогда не сталкивался с ошибкой маршрутизации из-за них.


person Anson    schedule 04.12.2012    source источник
comment
Не по теме: не используйте get (например, get 'approve') для путей изменения состояния. Это CSRF-дыра! Лучше подумай о post/put.   -  person jdoe    schedule 04.12.2012
comment
Тот факт, что в сообщении об ошибке нет :id=>3, вызывает подозрение, а также объясняет ошибку (у вас нет маршрута для /students), но не причину. Возможный конфликт маршрутов? У вас есть что-нибудь еще для студенческого контроллера?   -  person Mike Campbell    schedule 04.12.2012
comment
@jdoe хороший улов. Я исправлю это. @mike-campbell, ты заметил подсказку, указывающую на #index.   -  person Anson    schedule 04.12.2012


Ответы (1)


Да, это было что-то простое. Я сделал неправильное предположение, что ошибка маршрутизации означает, что контроллер и представления не достигнуты... и этот "гений" забыл, что в журналах есть полная трассировка стека:

Completed 500 Internal Server Error in 89ms

ActionController::RoutingError (No route matches {:controller=>"students"}):
  app/views/shared/_breadcrumbs.html.erb:27:in `_app_views_shared__breadcrumbs_html_erb___658518109680707361_70357170598800'
  app/views/layouts/application.html.erb:45:in `_app_views_layouts_application_html_erb__2976677320852012228_70357170792580'
  app/controllers/students_controller.rb:19:in `show'

Мои хлебные крошки пытались построить ссылку на students#index, которой не существует. Хлебные крошки пытаются обработать этот случай (строка 25), но проверка для вложенных ресурсов завершается неудачей:

25: <% elsif controller.class.action_methods.include?('index') %>
26:   <li>
27:     <%= link_to controller_name.titleize, :controller => controller_name, :action => 'index' %>
28:     <span class="divider">/</span>
29:   </li>
person Anson    schedule 04.12.2012