Очень основная проблема с маршрутами в 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.
Несколько вещей, которые следует иметь в виду при работе с маршрутами:
rake routes
выводит карту URL на ваши контроллеры- При обеспечении обратной совместимости перенаправьте пользователя на правильный путь
Лично мне еще предстоит обновить свое приложение до Rails 3, и я буду тянуть ноги, пока мне действительно не понадобится это сделать (только недавно вытащил его за дверь). В Rails 2.x у вас были маршруты ресурсов, но если вы сохранили маршрут по умолчанию для контроллера / действия / идентификатора, он провалился бы и разрешился. Похоже, что это больше не относится к Rails 3. По сути, ваши маршруты ресурсов обрабатывают все URL-адреса в этом пространстве имен ресурсов (/people в вашем случае).
Чтобы обеспечить обратную совместимость, я бы добавил перенаправление для устранения этой несовместимости.
match "/people/index", :to => redirect("/people")
Основная причина этого заключается в том, чтобы запретить пользователям сохранять неправильные URL-адреса для своих личных ссылок, в то же время позволяя устаревшим пользователям по-прежнему иметь возможность получить то, что им нужно.
Изменить: Новый ответ, удален, указывая на опечатку в вопросе.