Rails игнорирует маршрут сбора и вместо этого идет действие show - PullRequest
16 голосов
/ 23 июня 2010

В моем файле rout.rb настроены следующие маршруты:

resources :people do 
  collection do
    get :search
  end
end

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

Проблема, на мой взгляд, состоит в том, что URL-адрес show 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"}

Ответы [ 3 ]

28 голосов
/ 24 июня 2010

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

1 голос
/ 15 декабря 2012

У меня тоже была похожая проблема. По вашему примеру мой route.rb выглядел так

resources :people

...

resources :people do
    collection do
      get :search
    end
  end

Изменено:

resources :people do
    collection do
      get :search
    end
  end

...

resources :people

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

0 голосов
/ 23 июня 2010

Какую версию 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...