使用标准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
。
有没有办法以这种方式映射资源,控制器名称变成可选的?
答案 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“使用浅路线”获取相关信息。