Очень основная проблема с маршрутами в ruby

Я новичок в ruby, и при создании примера приложения обнаружил проблему, заключающуюся в том, что всякий раз, когда я захожу на http://127.0.0.1:3000/people/index по умолчанию выполняется действие show, а индекс принимается в качестве параметра. Это журнал сервера:

 Started GET "/people/index" for
 127.0.0.1 at 2010-12-23 18:43:01 +0500 Processing by PeopleController#show as
 HTML Parameters: {"id"=>"index"}

У меня есть это в моем файле маршрута:

root :to => "people#index"   
resources :people
match ':controller(/:action(/:id(.:format)))'

Что здесь происходит и как я могу решить проблему?

2 ответа

Маршрут

resources :people

создает "sub"-руты

get    '/people'          => 'people#index'
get    '/people/new'      => 'people#new'
post   '/people'          => 'people#create'
get    '/people/:id'      => 'people#show'
get    '/people/:id/edit' => 'people#edit'
put    '/people/:id'      => 'people#update'
delete '/people/:id'      => 'people#destroy'

На самом деле, все эти под-маршруты включают (.:format) в конце распознанного пути.

Путь /people/index будет признан по маршруту /people/:id, сопоставление с действием #show,

Путь /people будет признан по маршруту /people, сопоставление с действием #index,

Используйте помощники URL people_path а также people_url для /people маршрут.

Чтобы заставить Rails путешествовать задом наперед, прежде чем он поддерживал REST и понимать /people/index, сделай это:

resources :people do
  get :index => 'people#index'
end

Возможно, вы захотите посмотреть этот эпизод Railscast.

Несколько вещей, которые следует иметь в виду при работе с маршрутами:

  1. rake routes выводит карту URL на ваши контроллеры
  2. При обеспечении обратной совместимости перенаправьте пользователя на правильный путь

Лично мне еще предстоит обновить свое приложение до Rails 3, и я буду тянуть ноги, пока мне действительно не понадобится это сделать (только недавно вытащил его за дверь). В Rails 2.x у вас были маршруты ресурсов, но если вы сохранили маршрут по умолчанию для контроллера / действия / идентификатора, он провалился бы и разрешился. Похоже, что это больше не относится к Rails 3. По сути, ваши маршруты ресурсов обрабатывают все URL-адреса в этом пространстве имен ресурсов (/people в вашем случае).

Чтобы обеспечить обратную совместимость, я бы добавил перенаправление для устранения этой несовместимости.

match "/people/index", :to => redirect("/people")

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

Изменить: Новый ответ, удален, указывая на опечатку в вопросе.

Другие вопросы по тегам