2009-11-12 2 views
3

С помощью стандартной механики маршрутизации map.resource и нескольких вложенных ресурсов результирующие маршруты являются излишне длинными. Рассмотрим следующий маршрут:Могут ли имена контроллеров в маршрутах RESTful быть необязательными?

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

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

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

site.org/pavelshved/blogging-horror/12345 

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

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

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

ответ

2

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

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

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

1

Прямо из routes.rb по умолчанию:

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

Вы могли бы написать:

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

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

+0

Означает ли это, что я должен написать эти все маршруты в дополнение к этой красивой схеме, например, map.resources: users do | user | ; user.resources: blogs; end'? –

+0

Да. Названные маршруты - это именно так называемые.Они ожидают увидеть имя контроллера в URL-адресе (в большинстве случаев идентификатор ссылочного объекта тоже). Этот маршрут эффективно говорит «ОК, если вы не можете определить имя контроллера из URL-адреса, и он имеет 3 сегмента, просто отправьте его таким образом и сопоставьте сегменты с этими параметрами». –

-1

Google «рельсы мелкие маршруты» для получения информации об этом.

+0

Это не делает то, что нужно. Я все же хочу подчеркнуть, что «блоги» принадлежат «пользователям». –

1

Попробуйте

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 

Я надеюсь, что это работает :)

+0

И где мое «редактирование», «новое» и т. Д. Действие? –

+0

+: member => {: edit => get,: create =>: any,: destroy =>: delete} это просто мое предложение –

4

Вы ищете: вариант 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-адресов с указанными маршрутами, но для этого требуется некоторое дублирование, чтобы успокоиться. И вы столкнетесь с теми же проблемами при попытке использовать помощники маршрута.