Рельсы особый ресурс все еще множественного числа?

У меня есть маршрут поиска, который я хотел бы сделать сингулярным, но когда я укажу особый маршрут, он все еще выполняет множественные маршруты контроллера, так ли это должно быть?

resource :search

Дает мне

 search POST        /search(.:format)        {:action=>"create", :controller=>"searches"}
 new_search  GET    /search/new(.:format)    {:action=>"new", :controller=>"searches"}
 edit_search GET    /search/edit(.:format)   {:action=>"edit", :controller=>"searches"}
             GET    /search(.:format)        {:action=>"show", :controller=>"searches"}
             PUT    /search(.:format)        {:action=>"update", :controller=>"searches"}
             DELETE /search(.:format)        {:action=>"destroy", :controller=>"searches"}

Множественный контроллер "ищет"

У меня есть только один маршрут... для создания поиска:

Итак, я сделал: match "search" => "search#create"

Мне просто интересно будущее, если я все еще должен держать контроллер множественным числом? Rails 3.0.9

Ответ 1

Да, как это должно быть. Цитата из Rails Guide по маршрутизации:

Поскольку вы можете использовать один и тот же контроллер для единственного маршрута (/account) и множественный маршрут (/accounts/45), карта особых ресурсов к множественным контроллерам.

http://edgeguides.rubyonrails.org/routing.html#singular-resources

Ответ 2

Вы можете исправить это, установив множественное число "поиск", чтобы быть несчетным, поэтому в config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
   inflect.uncountable %w( search )
end

Теперь это позволит использовать поиск только

Ответ 3

Вы хотите, чтобы для создания был создан только один маршрут?

Если да:

resource :search, :only => :create

Тот факт, что контроллер для ресурса REST назван search_controller - это соглашение (которое вы можете изменить, вытеснив имя контроллера на маршруте с помощью resource :search, :only => :create, :controller => :search, но это не стоит...).

Ответ 4

Является ли поиск действительно ресурсом? Если это так, то то, что вы создаете, является экземпляром модели с типом "поиска", и в этом случае множественный контроллер "ищет" имеет смысл.

Однако, если это контроллер, который не имеет нескольких моделей, то, возможно, нет. В этом случае вам не нужно определять маршруты с помощью resource :search, вы можете просто использовать get 'search/create', чтобы сообщить маршрутизатору ответить "поиск/создание" на действие "создать" в вашем контроллере поиска.