Есть ли способ автоматически создавать множественный маршрут для индекса и единственный для всего остального?

#ruby-on-rails #resources #routing

#ruby-on-rails #Ресурсы #маршруты

Вопрос:

При работе с ресурсом коллекции мне нравится использовать множественное число для индекса (т.Е. страница списка (просмотр многих объектов) и страница в единственном числе для других страниц (создание / обновление / удаление одного объекта).

Для этого мне, похоже, нужно создавать свои маршруты следующим образом:

 map.objects 'objects.:format', :controller => :object, :action => :index, :conditions => { :method => :get }
map.resources :object, :controller => :object, :except => :index
  

Это создает маршруты следующим образом:

      objects GET    /objects(.:format)          {:action=>"index", :controller=>"object"}
object_index POST   /object(.:format)           {:action=>"create", :controller=>"object"}
  new_object GET    /object/new(.:format)       {:action=>"new", :controller=>"object"}
 edit_object GET    /object/:id/edit(.:format)  {:action=>"edit", :controller=>"object"}
      object GET    /object/:id(.:format)       {:action=>"show", :controller=>"object"}
             PUT    /object/:id(.:format)       {:action=>"update", :controller=>"object"}
             DELETE /object/:id(.:format)       {:action=>"destroy", :controller=>"object"}
  

Это работает, но, похоже, я использую дополнительную строку в своем файле routes (чтобы явно указать маршрут индекса), когда мне не нужно. Есть ли способ сделать то, что я хочу, одним маршрутом? Или, альтернативно, есть причина не прокладывать маршрут таким образом?

Ответ №1:

Единственная причина, кроме «обычный REST говорит, что не надо», по которой «объект» не должен быть ресурсом в разделе «объекты», — это поисковые системы.

Google заметит, что у вас есть «рецепты», а затем recipes в разделе «рецепты», и предоставит вам эти классные дополнительные ссылки:

дополнительные ссылки

В первом пункте руководства Google для веб-мастеров в разделе рекомендации по дизайну и контенту говорится: «Создайте сайт с четкой иерархией и текстовыми ссылками».

Ответ №2:

Маршрутизация RESTful разработана таким образом, что вы определяете, что именно вы хотите сделать. Допустим, вы переходите к http://example.com/objects . Здесь вы сообщаете сайту, что вам нужен список объектов.

Теперь, когда вы переходите к http://example.com/objects/2 , вы сообщаете ему, что хотите увидеть объект с идентификатором 2 в этом списке объектов (или ресурсе).

Наконец, когда вы переходите к http://example.com/objects/2/edit , вы говорите, что хотите снова найти объект с идентификатором 2, но на этот раз вы хотели бы отредактировать его, а не просматривать.

Идя против правил, как вы предложили в routing helpers, вы причините огромную ненужную боль себе и всем остальным, кто читает ваш код.

Однако, если вы решите пойти этим путем (опять же, я не советую этого делать), тогда да, определение двух маршрутов — единственный способ.

Комментарии:

1. @Ryan, я понимаю, как работает маршрутизация RESTful, но я не согласен с тем, что будет неудобно, если URL-адреса будут иметь немного больше смысла (с точки зрения английского языка), помимо наличия дополнительной строки в файле routes, как вы упомянули. С точки зрения пользователя, который не знает REST и не заботится о нем, может быть немного понятнее, что /objects это страница списка, в то время как /object/2 ссылается на объект с идентификатором 2 (удобно ли использовать числовой идентификатор для пользователя — это другая история)

2. @Daniel: если вы думаете, что пользователи так сильно заботились о URL-адресах, то почему у ebay такие ужасные URL-адреса, но он по-прежнему успешен? Честно говоря, вы тратите слишком много времени на размышления о проблеме, которую никто не заметит / о которой не позаботится.

3. @Ryan Я согласен с Дэниелом в этом, я думаю, что создание URL-адресов очень важно для опытных пользователей и для того, чтобы пользователи могли догадаться, как настроена ваша система. Здесь также учитывается SEO.

4. @Jesse: При всем моем уважении, я думаю, что мои пользователи достаточно умны, чтобы иметь возможность читать мои URL-адреса и обнаруживать, что они состоят из множественных слов и легко адаптируются. Даже в этом случае «ресурсы» разделены на множество частей, так почему же они отличаются от основных с таким небольшим выигрышем?

5. @Ryan — Я говорю, что мне нравится структура SO, и эта структура URL важна… Если вы согласны, то мы на одной странице. Я бы не стал делать /objects и /object/23