Rails игнорирует маршрут сбора и вместо этого запускает действие show

У меня есть следующие маршруты, установленные в файле routes.rb:

resources :people do 
  collection do
    get :search
  end
end

Когда я выполняю действие на URL-адресе: http://localhost:3000/people/search.json?term=stepeb, сервер сообщает, что он отвечает действием show, с правильным параметром термина, но также имеет параметр id, установленный в "поиск".

Проблема, как я вижу, - это два URL-адреса URL-адрес шоу:

/people/:id

и я считаю, что маршрутизатор соответствует этому маршруту до того, как он попадет в /people/search

Если это так, как будут работать маршруты на основе коллекции? Неужели они все поймают действие шоу?

Соответствующая часть маршрутов рейка выглядит следующим образом:

 search_people GET      /people/search(.:format)                                                         {:action=>"search", :controller=>"people"}
                                     GET      /people(.:format)                                                                {:action=>"index", :controller=>"people"}
                              people POST     /people(.:format)                                                                {:action=>"create", :controller=>"people"}
                          new_person GET      /people/new(.:format)                                                            {:action=>"new", :controller=>"people"}
                                     GET      /people/:id(.:format)                                                            {:action=>"show", :controller=>"people"}
                                     PUT      /people/:id(.:format)                                                            {:action=>"update", :controller=>"people"}
                              person DELETE   /people/:id(.:format)                                                            {:action=>"destroy", :controller=>"people"}
                         edit_person GET      /people/:id/edit(.:format)                                                       {:action=>"edit", :controller=>"people"}

Ответ 1

Дох, забудь об этом. Оказывается, у меня были дубликаты ресурсов: люди в верхней части файла маршрутов. Сначала Rails поразил это. Кажется, там действительно должна быть проверка на наличие дублированного определения маршрута.

Ответ 2

Какую версию Rails вы используете? Попробуйте создать тестовое приложение только с кодом, который вы указали здесь, и посмотреть, работает ли он. Возможно, что-то еще вызывает конфликт, о котором вы не упомянули.

Используя ваш код на Rails 3.0.0beta4, вы получите желаемые результаты:

Started GET "/people/search.json?term=boo" for 192.168.1.2 at 2010-06-23 03:39:26 -0400
  Processing by PeopleController#search as JSON
  Parameters: {"term"=>"boo"}
Completed   in 49ms

Вот мой файл маршрутов:

  resources :people do
    collection do
      get :search
    end
  end

У меня есть user_controller.rb с определенным методом поиска.

Ответ 3

У меня также была аналогичная проблема. В соответствии с вашим примером мои маршруты .rb выглядели следующим образом:

resources :people

...

resources :people do
    collection do
      get :search
    end
  end

Изменено:

resources :people do
    collection do
      get :search
    end
  end

...

resources :people

и я могу получить доступ к коллекции... Кстати, это подходящий способ добавления маршрутов? то есть хороший стиль, чтобы просто добавить новый маршрут при добавлении действия в контроллер и оставлении "старых" ресурсов: людям это нравится?