Имя единственного ресурса, разделенное его слагом (Routing) - PullRequest
1 голос
/ 15 августа 2010

У меня есть следующие маршруты Rails 3:

Hello::Application.routes.draw do
  resources :blogs do
    resources :articles do
      resources :comments
    end
  end
end

Сгребая их, мы можем найти:

                          GET    /blogs/:blog_id/articles/:article_id/comments(.:format)          {:action=>"index", :controller=>"comments"}
    blog_article_comments POST   /blogs/:blog_id/articles/:article_id/comments(.:format)          {:action=>"create", :controller=>"comments"}
 new_blog_article_comment GET    /blogs/:blog_id/articles/:article_id/comments/new(.:format)      {:action=>"new", :controller=>"comments"}
                          GET    /blogs/:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"show", :controller=>"comments"}
                          PUT    /blogs/:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"update", :controller=>"comments"}
     blog_article_comment DELETE /blogs/:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"destroy", :controller=>"comments"}
edit_blog_article_comment GET    /blogs/:blog_id/articles/:article_id/comments/:id/edit(.:format) {:action=>"edit", :controller=>"comments"}
                          GET    /blogs/:blog_id/articles(.:format)                               {:action=>"index", :controller=>"articles"}
            blog_articles POST   /blogs/:blog_id/articles(.:format)                               {:action=>"create", :controller=>"articles"}
         new_blog_article GET    /blogs/:blog_id/articles/new(.:format)                           {:action=>"new", :controller=>"articles"}
                          GET    /blogs/:blog_id/articles/:id(.:format)                           {:action=>"show", :controller=>"articles"}
                          PUT    /blogs/:blog_id/articles/:id(.:format)                           {:action=>"update", :controller=>"articles"}
             blog_article DELETE /blogs/:blog_id/articles/:id(.:format)                           {:action=>"destroy", :controller=>"articles"}
        edit_blog_article GET    /blogs/:blog_id/articles/:id/edit(.:format)                      {:action=>"edit", :controller=>"articles"}
                          GET    /blogs(.:format)                                                 {:action=>"index", :controller=>"blogs"}
                    blogs POST   /blogs(.:format)                                                 {:action=>"create", :controller=>"blogs"}
                 new_blog GET    /blogs/new(.:format)                                             {:action=>"new", :controller=>"blogs"}
                          GET    /blogs/:id(.:format)                                             {:action=>"show", :controller=>"blogs"}
                          PUT    /blogs/:id(.:format)                                             {:action=>"update", :controller=>"blogs"}
                     blog DELETE /blogs/:id(.:format)                                             {:action=>"destroy", :controller=>"blogs"}
                edit_blog GET    /blogs/:id/edit(.:format)                                        {:action=>"edit", :controller=>"blogs"}

Поскольку все маршруты начинаются с одного и того же корневого пути ( / blogs ), я хотел бы сократить адреса, удалив его (когда задано: blog_id).

По этой причине у меня могут быть эти маршруты (я думаю, что это более СУХОЙ):

                          GET    /:blog_id/articles/:article_id/comments(.:format)          {:action=>"index", :controller=>"comments"}
    blog_article_comments POST   /:blog_id/articles/:article_id/comments(.:format)          {:action=>"create", :controller=>"comments"}
 new_blog_article_comment GET    /:blog_id/articles/:article_id/comments/new(.:format)      {:action=>"new", :controller=>"comments"}
                          GET    /:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"show", :controller=>"comments"}
                          PUT    /:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"update", :controller=>"comments"}
     blog_article_comment DELETE /:blog_id/articles/:article_id/comments/:id(.:format)      {:action=>"destroy", :controller=>"comments"}
edit_blog_article_comment GET    /:blog_id/articles/:article_id/comments/:id/edit(.:format) {:action=>"edit", :controller=>"comments"}
                          GET    /:blog_id/articles(.:format)                               {:action=>"index", :controller=>"articles"}
            blog_articles POST   /:blog_id/articles(.:format)                               {:action=>"create", :controller=>"articles"}
         new_blog_article GET    /:blog_id/articles/new(.:format)                           {:action=>"new", :controller=>"articles"}
                          GET    /:blog_id/articles/:id(.:format)                           {:action=>"show", :controller=>"articles"}
                          PUT    /:blog_id/articles/:id(.:format)                           {:action=>"update", :controller=>"articles"}
             blog_article DELETE /:blog_id/articles/:id(.:format)                           {:action=>"destroy", :controller=>"articles"}
        edit_blog_article GET    /:blog_id/articles/:id/edit(.:format)                      {:action=>"edit", :controller=>"articles"}
                          GET    /blogs(.:format)                                                 {:action=>"index", :controller=>"blogs"}
                    blogs POST   /blogs(.:format)                                                 {:action=>"create", :controller=>"blogs"}
                 new_blog GET    /blogs/new(.:format)                                             {:action=>"new", :controller=>"blogs"}
                          GET    /blogs/:id(.:format)                                             {:action=>"show", :controller=>"blogs"}
                          PUT    /blogs/:id(.:format)                                             {:action=>"update", :controller=>"blogs"}
                     blog DELETE /blogs/:id(.:format)                                             {:action=>"destroy", :controller=>"blogs"}
                edit_blog GET    /blogs/:id/edit(.:format)                                        {:action=>"edit", :controller=>"blogs"}

По вашему мнению, какие изменения я должен внести в мою текущую конфигурацию маршрутов?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2011

«Ресурсы никогда не должны быть вложены глубже, чем на 1 уровень». (http://guides.rubyonrails.org/routing.html)

Если в документации по Rails содержится сильная рекомендация, я понятия не имею, почему она по-прежнему разрешена.

0 голосов
/ 15 августа 2010

Мое мнение, что вам нужно смотреть на мелкие маршруты.Насколько мне известно, запрашиваемая вами настройка не достижима с использованием ресурсов маршрута, и я не думаю, что это желательно.

Если вы определили отношения один ко многим, вам не нужно передавать идентификатор для каждого из вложенных ресурсов.Это считается плохой практикой (некоторые, но не другие).Например, вместо этого длинного URL:

/blog/:blog_id/articles/:article_id/comments/:id
#controller
@blog = Blog.find params[:blog_id]
@article = Blog.find params[:article_id]
@comment = Comment.find params[:id]

вам действительно нужно только:

/comments/:id
#controller
@comment = Comment.find params[:id]
@article = @comment.article
@blog = @article.blog

Дополнительная информация: http://railscasts.com/episodes/139-nested-resources

...