RESTful路由中的控制器名称是否可选?

时间:2009-11-12 14:33:23

标签: ruby-on-rails routing

使用标准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

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

5 个答案:

答案 0 :(得分:4)

您正在寻找资源的: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 helper,但是你自己的包装器无法快速修复。

删除url的帖子部分的唯一方法是使用命名路由,但这些需要一些重复才能使其变得安静。在尝试使用路线助手时,你会遇到同样的问题。

答案 1 :(得分:2)

获得所需内容的最简单方法是创建一条路线,以及作为速记的RESTful路线:

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

您必须更改网址位,才能使用您过滤用户名称和博客名称的方式。但是当你想使用较短的URL时,你可以使用所有的short_blog_ * magic。

答案 2 :(得分:1)

直接退出默认routes.rb:

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

你可以写:

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

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

答案 3 :(得分:1)

试试这个

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

我希望它有效:)

答案 4 :(得分:-1)

Google“使用浅路线”获取相关信息。