Могут ли имена контроллеров в маршрутах RESTful быть необязательными? - PullRequest
3 голосов
/ 12 ноября 2009

При стандартной map.resource механике маршрутизации и нескольких вложенных ресурсах получающиеся маршруты неоправданно длинны. Рассмотрим следующий маршрут:

site.org/users/pavelshved/blogs/blogging-horror/posts/12345

Его легко создать в routes.rb, и я уверен, что он следует некоторой полезной логике маршрутизации. Но он слишком длинный и, похоже, не предназначен для восприятия человеком.

Хорошим улучшением было бы удаление имен контроллеров, поэтому это выглядит так:

site.org/pavelshved/blogging-horror/12345

Ясно, просто, коротко. Это может стать неоднозначным, но в моем случае я не собираюсь называть пользователей, например, "пользователи".

Я попытался установить :as => '', но он выдает такие маршруты: site.org//pavelshved//blogging-horror//12345 при генерации их стандартными помощниками.

Есть ли способ сопоставить ресурсы таким образом, чтобы имена контроллеров стали необязательными?

Ответы [ 5 ]

4 голосов
/ 12 ноября 2009

Вы ищете параметр: path_prefix для ресурсов.

map.resources :users do |user|
  user.resources :blogs do |blog|
    blog.resources :posts, :path_prefix => '/:user_login/:blog_title/:id'
  end
end

Создает маршруты отдыха для всех блогов этой формы: site.org/pavelshved/bogging-horror/posts/1234. Вам нужно будет приложить немного дополнительных усилий, чтобы использовать помощники по URL, но ничто из собственной оболочки не сможет быстро исправить.

Единственный способ избавиться от почтовой части URL-адреса - с помощью именованных маршрутов, но они требуют некоторого дублирования, чтобы успокоиться. И вы столкнетесь с такими же проблемами при попытке использовать помощники по маршруту.

2 голосов
/ 12 ноября 2009

Самый простой способ получить то, что вы хотите, - это создать маршрут в дополнение к вашим маршрутам RESTful, который действует как сокращение:

map.short_blog ':user_id/:blog_id/:id', :controller => 'posts', :action => 'show'

Вам придется изменить биты URL, чтобы работать с тем, как вы фильтруете имя пользователя и название его блога. Но затем, когда вы захотите использовать более короткий URL, вы можете использовать всю магию short_blog_ *.

1 голос
/ 12 ноября 2009

Попробуйте это

map.pavelshved '/pavelshved/', :controller => :users, :action => view or
map.pavelshved '/:id', :controller => :users, :action => show do | blogs|
  blogs.bloging '/:id', :controller => :blogs, :action => show do | post|
    post.posting '/:id', :controller => :posts, :action => show
  end
end

Надеюсь, это сработает:)

1 голос
/ 12 ноября 2009

Прямо из маршрутов по умолчанию. Rb:

map.connect 'products/:id', :controller => 'catalog', :action => 'view'

Вы можете написать:

map.connect ':user_id/:blog_id/:id', :controller => 'posts', :action => 'show'

Но обязательно включите это в самый конец файла, иначе он попытается сопоставить каждые три уровня с глубиной URL.

0 голосов
/ 12 ноября 2009

Google "рельсы неглубокие маршруты" для информации об этом.

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