【问题标题】:Singular resources namespaced by its slug (Routing)由其 slug 命名的奇异资源(路由)
【发布时间】:2011-03-30 01:40:45
【问题描述】:

我有以下 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"}

按照你的说法,我应该对我当前的路由配置做什么样的改变?

谢谢。

【问题讨论】:

    标签: ruby-on-rails routing routes url-routing


    【解决方案1】:

    我的意见是你需要看看浅层路线。据我所知,您所要求的自定义无法使用路线资源实现,我认为这不是可取的。

    如果您定义了一对多关系,则无需为每个嵌套资源传递标识符。这被认为是不好的做法(有些人,但不是其他人)。例如,而不是这个长网址:

    /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

    【讨论】:

    • 刚刚注意到您使用的是 rails 3,但我认为没有太大变化。
    • 是的,但是现在浅层已经用 rails 3 结束了。
    • “结束”是什么意思?它只是尚未在您选择使用的候选版本中实现。 rails.lighthouseapp.com/projects/8994/tickets/3765。我的答案仍然成立。您可以定义命名的浅层路由或使用 2.3 并在资源上定义浅层嵌套。
    【解决方案2】:

    “资源的嵌套深度不得超过 1 级。” (http://guides.rubyonrails.org/routing.html)

    如果 Rails 文档提出了如此强烈的建议,我不知道为什么仍然允许这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2019-06-30
      • 1970-01-01
      • 2017-08-22
      相关资源
      最近更新 更多