Ответ 1
Дох, забудь об этом. Оказывается, у меня были дубликаты ресурсов: люди в верхней части файла маршрутов. Сначала Rails поразил это. Кажется, там действительно должна быть проверка на наличие дублированного определения маршрута.
У меня есть следующие маршруты, установленные в файле 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"}
Дох, забудь об этом. Оказывается, у меня были дубликаты ресурсов: люди в верхней части файла маршрутов. Сначала Rails поразил это. Кажется, там действительно должна быть проверка на наличие дублированного определения маршрута.
Какую версию 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 с определенным методом поиска.
У меня также была аналогичная проблема. В соответствии с вашим примером мои маршруты .rb выглядели следующим образом:
resources :people
...
resources :people do
collection do
get :search
end
end
Изменено:
resources :people do
collection do
get :search
end
end
...
resources :people
и я могу получить доступ к коллекции... Кстати, это подходящий способ добавления маршрутов? то есть хороший стиль, чтобы просто добавить новый маршрут при добавлении действия в контроллер и оставлении "старых" ресурсов: людям это нравится?