ресурс rails единственного числа по-прежнему множественный?

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

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"

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


person holden    schedule 04.08.2011    source источник


Ответы (4)


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

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

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

person M. Cypher    schedule 04.08.2011
comment
ах, хорошо, еще мне нужно указать @search +: url = ›search_path или form_for не будет работать на отдельном маршруте? - person holden; 04.08.2011
comment
Я ожидал, что он будет работать без параметра: url. Но просто попробуй, я полагаю. - person M. Cypher; 04.08.2011
comment
Вы можете сделать resource :search, :controller => :search. - person Mario Uher; 04.08.2011
comment
Кстати, у меня есть модель под названием «ныряние и рельсы», которая отличается особой разницей, что неверно. Чтобы исправить это, мне пришлось обновить файл Infections.rb, добавив inflect.irregular 'dive', 'dives'. Теперь маршруты правильно / dive / new вместо / dife / new. - person Ryan; 05.05.2012

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

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

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

person Yule    schedule 04.08.2011
comment
Спасибо за ответ. Это казалось самым простым способом избежать путаницы в единственном и множественном числе. Различие в единственном и множественном числе может иметь смысл, когда контроллеры связаны с моделью в соответствии с соглашением Rails, но когда это не так, я не вижу смысла для Rails, автоматически добавляющих идентификаторы множественного числа. - person Teemu Leisti; 07.06.2013
comment
Проблема заключается в том, что если вы используете замещающее слово где-либо еще, оно больше не будет иметь правильного множественного числа. - person Jacob Lockard; 07.07.2020

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

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

person Matt Connolly    schedule 04.08.2011

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

If so:

resource :search, :only => :create

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

person Andrea Salicetti    schedule 04.08.2011