2010-08-15 89 views
1

命名空間的奇異資源我有跟隨的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"} 

由於每個路線與同根開始路徑(/博客),我想通過刪除地址來縮短地址(當給出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"} 

根據你,我應該什麼樣的變化在我當前的路由配置?

謝謝。

回答

0

我的意見是你需要看淺層路線。據我所知,你所要求的定製是不能通過使用路由資源來實現的,我不認爲這是可取的。

如果您定義了一對多關係,則不需要爲每個嵌套資源傳遞標識符。這被認爲是不好的做法(有些人雖然不是其他人)。例如,而不是此長的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

+0

剛注意到你正在使用rails 3,但我認爲沒有太多改變。 – mark 2010-08-15 14:18:40

+0

是的,但現在淺已結束導軌3. – moshimoshi 2010-08-15 14:42:35

+0

'over'是什麼意思?它只是在您選擇使用的候選版本中尚未實現。 https://rails.lighthouseapp.com/projects/8994/tickets/3765。我的答案仍然存在。您可以定義命名的淺層路由,或者在資源上定義淺層嵌套時使用2.3。 – mark 2010-08-15 16:25:59

0

「資源不應該被嵌套超過1平深」 (http://guides.rubyonrails.org/routing.html)

如果Rails文檔使得這個建議的強大,我不知道爲什麼它仍然是允許的。