Именные роуты

Илья • 26 января 2007 г.

Пожалуйста не забывайте, что существует такая прекрасная штуковина как именные роуты. Поэтому, в частности, не нужно каждый раз городить штуки, на подобии этой вот:

link_to "Vasya Pupkin", :controller => "users", :action => "show", :id => user

Особенно не приятно, когда такая длиннющая конструкция встречается в проекте много раз. В этой ситуации нас выручат именные роуты. И вот как они работают в двух словах:

В config/routes.rb создаём новое правило:
map.user "users/:id", :controller => "users", :action => "show"

Заметьте, что вместо привычного map.connect, я использовал map.user. А это значит, что теперь в любом уголке своего приложения я могу использовать метод user_url(user), который вернёт мне :controller => ‘users’, :action => ‘show’, :id => user.id.

Теперь переписываем нашу ссылку, для использования с новеньким именным роутом:

link_to "Vasya Pupkin", user_url(@user)

Не правдо ли так гораздо чище и быстрее?

А теперь, перед тем как создать два десятка красивеньких именных роутов и избавиться от трёхэтажных link_to, посмотрите что ещё можно сделать.

Это работает не только с роутами, но и с любыми методами, которые принимают в виде аргументов хеш (сейчас это жутко модно). Если у нас подряд идёт вызов нескольких методов и в них передаются почти одинаковые хеши, то мы можем их объеденить при помощи метода #with_options. Вот, например, три обычных именных роута:

map.users "/users", :controller => "users", :action => "list"
map.user "/users/:id", :controller => "users", :action => "show"
map.deadsouls "/users/deads", :controller => "users", :action => "dead"

Как видите, все они ссылаются на один и тот же контроллер — users. Получается не очень DRY (Dont Repeat Yourself). Тут то и приходит на помощь прекрасный #with_options:

map.with_options :controller => "users" do |users|
  users.users "/users", :action => "list"
  users.user "/users/:id", :action => "show"
  users.deadsouls "/users/deads", :action => "deads"
end

Теперь кусок :controller => “users” передаётся во все роуты, хотя написали мы его только один раз.

Заметка написана по мотивам блога великолепного Jamis Buck.

2 комментария:

  1. Maxim Kulkin:

    Блин, вот раздражает: все пишут одно и то же. То же самое, что читать туториал по созданию сайта со scaffold: нажал две кнопки и все работает.

    Предлагаю дополнить заметку темами: 1. использование разных экшенов с именованными урлами. 2. использование дополнительных параметров в урле (например, есть система документооборота, и надо вывести все документы определенного пользователя за определенный месяц. Предположим, нужны урлы типа /archive/2006/12/1-bob/). Возможно, не всегда имеет смысл использовать именованные урлы, тогда надо описать соображения на эту тему.

    Понятно, что для редактирования и удаления модно использовать разные HTTP методы (GET, POST, PUT, DELETE). Неплохо было бы описать это для новичков.

  2. Maxim Kulkin:

    Deadsouls ? Жжоте =) Ничего более позитивного в голову не пришло ? =)

Извините, но комментарии для этой статьи уже закрыты.