【问题标题】:Can controller names in RESTful routes be optional?RESTful 路由中的控制器名称可以是可选的吗?
【发布时间】:2009-11-12 14:33:22
【问题描述】:

使用标准的map.resource 路由机制和多个​​嵌套资源,生成的路由不必要地长。考虑以下路线:

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

routes.rb 中很容易创建,而且我确信它遵循某种有益的路由逻辑。但它太长了,而且似乎不适合人类阅读。

一个不错的改进是删除控制器名称,所以它看起来像:

site.org/pavelshved/blogging-horror/12345

清晰、简单、简短。它可能变得模棱两可,但就我而言,例如,我不会将任何用户命名为“用户”。

我尝试设置:as => '',但它会产生这样的路由:site.org//pavelshved//blogging-horror//12345 由标准助手生成它们时。

有没有办法以控制器名称成为可选的方式映射资源?

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    您正在寻找资源的 :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 中的帖子部分的唯一方法是使用命名路由,但这些需要一些重复才能保持安静。在尝试使用路由助手时,您会遇到同样的问题。

    【讨论】:

      【解决方案2】:

      获得所需内容的最简单方法是在 RESTful 路由之外创建一个路由作为速记:

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

      您必须更改 URL 位以适应您过滤用户名称和博客名称的方式。但是,当您想使用较短的 URL 时,您可以使用所有 short_blog_* 魔法。

      【讨论】:

        【解决方案3】:

        直接跳出默认routes.rb:

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

        你可以写:

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

        但请务必将其包含在文件的最后,否则它会尝试将每三个级别的深度 url 匹配到它。

        【讨论】:

        • 这是否意味着除了像map.resources :users do |user| ; user.resources :blogs ; end 这样的漂亮架构之外,我还应该编写这些所有路由?
        • 是的。命名的路线就是这样 - 命名的。他们希望在 url 中看到控制器名称(大多数时候也是引用对象的 ID)。该路由有效地表示“好的,如果您无法从 URL 中找出控制器名称,并且它有 3 个段,只需以这种方式发送并将这些段映射到这些参数”。
        【解决方案4】:

        试试这个

        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
        

        我希望它有效:)

        【讨论】:

        • + :member => {:edit => get, :create => :any, :destroy => :delete} 这只是我的建议
        【解决方案5】:

        谷歌“rails shallow routes”了解这方面的信息。

        【讨论】:

        • 这不能满足需要。我还是要强调,“博客”是属于“用户”的。
        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多