Мелкие маршруты с path_prefix? - PullRequest
4 голосов
/ 12 апреля 2009

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

Однако я уже использовал path_prefix:

map.with_options :path_prefix => "blog" do |blog|
  blog.resources :posts do |posts|
    posts.resources :comments
  end
end

Обратите внимание, что все маршруты имеют префикс "/ blog", как и ожидалось.

# $ rake routes
#             posts GET    /blog/posts(.:format)                            {:controller=>"posts", :action=>"index"}
#                   POST   /blog/posts(.:format)                            {:controller=>"posts", :action=>"create"}
#          new_post GET    /blog/posts/new(.:format)                        {:controller=>"posts", :action=>"new"}
#         edit_post GET    /blog/posts/:id/edit(.:format)                   {:controller=>"posts", :action=>"edit"}
#              post GET    /blog/posts/:id(.:format)                        {:controller=>"posts", :action=>"show"}
#                   PUT    /blog/posts/:id(.:format)                        {:controller=>"posts", :action=>"update"}
#                   DELETE /blog/posts/:id(.:format)                        {:controller=>"posts", :action=>"destroy"}
#     post_comments GET    /blog/posts/:post_id/comments(.:format)          {:controller=>"comments", :action=>"index"}
#                   POST   /blog/posts/:post_id/comments(.:format)          {:controller=>"comments", :action=>"create"}
#  new_post_comment GET    /blog/posts/:post_id/comments/new(.:format)      {:controller=>"comments", :action=>"new"}
# edit_post_comment GET    /blog/posts/:post_id/comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"}
#      post_comment GET    /blog/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"show"}
#                   PUT    /blog/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"update"}
#                   DELETE /blog/posts/:post_id/comments/:id(.:format)      {:controller=>"comments", :action=>"destroy"}

Новая конфигурация маршрутизации выглядит следующим образом:

map.with_options :path_prefix => "blog", :shallow => true do |blog|
  blog.resources :posts do |posts|
    posts.resources :comments
  end
end

Теперь префикс "/ blog" отсутствует на некоторых моих маршрутах.

# $ rake routes
#            posts GET    /blog/posts(.:format)                  {:controller=>"posts", :action=>"index"}
#                  POST   /blog/posts(.:format)                  {:controller=>"posts", :action=>"create"}
#         new_post GET    /blog/posts/new(.:format)              {:controller=>"posts", :action=>"new"}
#        edit_post GET    /posts/:id/edit(.:format)              {:controller=>"posts", :action=>"edit"}
#             post GET    /posts/:id(.:format)                   {:controller=>"posts", :action=>"show"}
#                  PUT    /posts/:id(.:format)                   {:controller=>"posts", :action=>"update"}
#                  DELETE /posts/:id(.:format)                   {:controller=>"posts", :action=>"destroy"}
#    post_comments GET    /posts/:post_id/comments(.:format)     {:controller=>"comments", :action=>"index"}
#                  POST   /posts/:post_id/comments(.:format)     {:controller=>"comments", :action=>"create"}
# new_post_comment GET    /posts/:post_id/comments/new(.:format) {:controller=>"comments", :action=>"new"}
#     edit_comment GET    /comments/:id/edit(.:format)           {:controller=>"comments", :action=>"edit"}
#          comment GET    /comments/:id(.:format)                {:controller=>"comments", :action=>"show"}
#                  PUT    /comments/:id(.:format)                {:controller=>"comments", :action=>"update"}
#                  DELETE /comments/:id(.:format)                {:controller=>"comments", :action=>"destroy"}

Я ищу решение, чтобы вернуть префиксы для всех маршрутов. Я знаю, что он работает с пространствами имен (map.namespace :blog do), но я хочу предотвратить рефакторинг всех моих контроллеров / представлений / тестов для фактического использования пространств имен.

Все примеры кода тестируются на Rails версии 2.3.2 и Ruby 1.8.7.

Ответы [ 2 ]

6 голосов
/ 13 апреля 2009

документация указывает на то, что это точное поведение является заданным:

: shallow - при значении true пути для вложенных ресурсов, которые ссылаются на определенный элемент (т. Е. Пути с параметром: id), не будут использовать префикс родительского пути или префикс имени.

(из http://api.rubyonrails.org/classes/ActionController/Resources.html#M000501)

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

map.with_options :path_prefix => "blog" do |blog|
  blog.resources :posts do |posts|
    posts.resources :comments, :only => [:index, :create, :new]
  end
  blog.resources :comments, :except => [:index, :create, :new]
end

В результате получаются следующие маршруты:

#             posts GET    /blog/posts                               {:controller=>"posts", :action=>"index"}
#                   POST   /blog/posts                               {:controller=>"posts", :action=>"create"}
#          new_post GET    /blog/posts/new                           {:controller=>"posts", :action=>"new"}
#         edit_post GET    /blog/posts/:id/edit                      {:controller=>"posts", :action=>"edit"}
#              post GET    /blog/posts/:id                           {:controller=>"posts", :action=>"show"}
#                   PUT    /blog/posts/:id                           {:controller=>"posts", :action=>"update"}
#                   DELETE /blog/posts/:id                           {:controller=>"posts", :action=>"destroy"}
#     post_comments GET    /blog/posts/:post_id/comments             {:controller=>"comments", :action=>"index"}
#                   POST   /blog/posts/:post_id/comments             {:controller=>"comments", :action=>"create"}
#  new_post_comment GET    /blog/posts/:post_id/comments/new         {:controller=>"comments", :action=>"new"}
#      edit_comment GET    /blog/comments/:id/edit                   {:controller=>"comments", :action=>"edit"}
#           comment GET    /blog/comments/:id                        {:controller=>"comments", :action=>"show"}
#                   PUT    /blog/comments/:id                        {:controller=>"comments", :action=>"update"}
#                   DELETE /blog/comments/:id                        {:controller=>"comments", :action=>"destroy"}

Надеюсь, это поможет!

5 голосов
/ 15 апреля 2009

Вероятно, самым простым решением было бы не использовать опцию: shallow, а создать те же маршруты с дополнительным определением ресурса:

map.with_options :path_prefix => "blog" do |blog|
  blog.resources :posts do |posts|
    posts.resources :comments, :only => [:index, :create, :new]
  end
end
map.resources :comments, :path_prefix => "blog",
              :except => [:index, :create, :new]

, который дает следующие определения маршрутов:

# $ rake routes
#            posts GET    /blog/posts(.:format)                       {:action=>"index", :controller=>"posts"}
#                  POST   /blog/posts(.:format)                       {:action=>"create", :controller=>"posts"}
#         new_post GET    /blog/posts/new(.:format)                   {:action=>"new", :controller=>"posts"}
#        edit_post GET    /blog/posts/:id/edit(.:format)              {:action=>"edit", :controller=>"posts"}
#             post GET    /blog/posts/:id(.:format)                   {:action=>"show", :controller=>"posts"}
#                  PUT    /blog/posts/:id(.:format)                   {:action=>"update", :controller=>"posts"}
#                  DELETE /blog/posts/:id(.:format)                   {:action=>"destroy", :controller=>"posts"}
#    post_comments GET    /blog/posts/:post_id/comments(.:format)     {:action=>"index", :controller=>"comments"}
#                  POST   /blog/posts/:post_id/comments(.:format)     {:action=>"create", :controller=>"comments"}
# new_post_comment GET    /blog/posts/:post_id/comments/new(.:format) {:action=>"new", :controller=>"comments"}
#     edit_comment GET    /blog/comments/:id/edit(.:format)           {:action=>"edit", :controller=>"comments"}
#          comment GET    /blog/comments/:id(.:format)                {:action=>"show", :controller=>"comments"}
#                  PUT    /blog/comments/:id(.:format)                {:action=>"update", :controller=>"comments"}
#                  DELETE /blog/comments/:id(.:format)                {:action=>"destroy", :controller=>"comments"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...