zoukankan      html  css  js  c++  java
  • rails3 正则路由

    2010-10-16

    Rails3 Route用法集锦

    文章分类:Ruby编程
    默认路由:
    Ruby代码
    1. # Rails3:  
    2. match '/:controller(/:action(/:id))'  
    3. # Rails2:  
    4. map.connect ':controller/:action/:id'  


    正则路由:
    Ruby代码
    1. # Rails3:  
    2. match 'products/:id':to => 'catalog#view'  
    3. # Rails2:  
    4. map.connect 'products/:id':controller => 'catalog':action => 'view'  


    命名路由:
    Ruby代码
    1. # Rails3:  
    2. match 'logout':to => 'sessions#destroy':as => 'logout'  
    3. # Rails2:  
    4. map.logout 'logout':controller => 'sessions':action => ''  


    根路由:
    Ruby代码
    1. # Rails3:  
    2. root => 'welcome#show'  
    3. # Rails2:  
    4. map.root :controller => 'welcome':action => 'show'  


    路由简写技巧:
    :to 键的省略:
    Ruby代码
    1. match 'account' => 'account#index'  
    2. # 相当于:  
    3. match 'account':to => 'account#index'  
    4.   
    5. match 'info' => 'projects#info':as => 'info'  

    注意:
    :as 在rails3中是改变 helper, 在rails2中是改变 path


    当路径和控制器(及action)一至时,可省略指派控制器部分
    Ruby代码
    1. match 'account/overview'  
    2. # 相当于:  
    3. match 'account/overview':to => 'account#overview'  


    Verb路由
    当需要限制http请求方法的时候通过键 :via ,也可以直接把方法写在最前面:
    Ruby代码
    1. get 'account/overview'  
    2. # 相当于:  
    3. match 'account/overview':via => 'get'  
    4.   
    5. match 'account/setup':via => [:get:post]  
    6. # 支持get\post\put\delete四种HTTP方法  


    resources路由:
    Ruby代码
    1. resources :posts:except => [:index]  
    2. resources :posts:only => [:new:create]  
    3.   
    4. # edit_post GET    /posts/:id/modify(.:format) {:controller=>"posts", :action=>"edit"}  
    5. resources :posts:path_names => { :edit => 'modify' }   
    6.   
    7. resources :projects do  
    8.   resources :tasks:people  
    9. end  
    10.   
    11. resources :products do  
    12.   collection do  
    13.     get  :sold  
    14.     post :on_offer:search  
    15.   end  
    16.   get :buy:on => :member  
    17.   post :batch:on => :collection  
    18. end  
    19.   
    20. resource :session do  
    21.   get :create  
    22. end  


    :shallow用法:
    Rails3中的shallow用法与Rails2中一致
    Ruby代码
    1. resources :blogs:shallow => true do  
    2.   resources :comments  
    3. end  

    使用:shallow前后相同部分:
    blog_commentsGET/blogs/:blog_id/comments(.:format){:controller=>"comments", :action=>"index"}
    blog_commentsPOST/blogs/:blog_id/comments(.:format){:controller=>"comments", :action=>"create"}
    new_blog_commentGET/blogs/:blog_id/comments/new(.:format){:controller=>"comments", :action=>"new"}
    blogsGET/blogs(.:format){:controller=>"blogs", :action=>"index"}
    blogsPOST/blogs(.:format){:controller=>"blogs", :action=>"create"}
    new_blogGET/blogs/new(.:format){:controller=>"blogs", :action=>"new"}
    edit_blogGET/blogs/:id/edit(.:format){:controller=>"blogs", :action=>"edit"}
    blogGET/blogs/:id(.:format){:controller=>"blogs", :action=>"show"}
    blogPUT/blogs/:id(.:format){:controller=>"blogs", :action=>"update"}
    blogDELETE/blogs/:id(.:format){:controller=>"blogs", :action=>"destroy"} 


    使用:shallow前后不同部分:
    不使用shallow选项:
    edit_blog_commentGET/blogs/:blog_id/comments/:id/edit(.:format){:controller=>"comments", :action=>"edit"}
    blog_commentGET/blogs/:blog_id/comments/:id(.:format){:controller=>"comments", :action=>"show"}
    blog_commentPUT/blogs/:blog_id/comments/:id(.:format){:controller=>"comments", :action=>"update"}
    blog_commentDELETE/blogs/:blog_id/comments/:id(.:format){:controller=>"comments", :action=>"destroy"}


    使用shallow选项后:
    edit_commentGET/comments/:id/edit(.:format){:controller=>"comments", :action=>"edit"}
    commentGET/comments/:id(.:format){:controller=>"comments", :action=>"show"}
    commentPUT/comments/:id(.:format){:controller=>"comments", :action=>"update"}
    commentDELETE/comments/:id(.:format){:controller=>"comments", :action=>"destroy"}

    可以看出使用shallow选项后,对于已经存在的资源使用简化方式操作,具体行为涉及到 edit\show\update\destroy 四种
    另外,shallow选项的有效范围是对自身及嵌套的资源都有效,如下面这个例子:
    Ruby代码
    1. resources :publishers do  
    2.   resources :magazines do  
    3.     resources :albums:shallow => true do  
    4.       resources :photos do  
    5.         resources :images  
    6.       end  
    7.     end  
    8.   end  
    9. end  

    这个例子中 albums、photos、images 都会使用简化方式,而 magazines 不会。特别注意:这种嵌套方式极不推荐,一般嵌套的层级最好不要超过一级

    scope路由
    :path 改变Path,:module 改变Controller, :name_prefix || :as 改变  helper
    Ruby代码
    1. scope 'admin' do  
    2.   resources :posts  
    3. end  
    4. # 行当于:  
    5. scope :path => 'admin' do  
    6.   resources :posts  
    7. end  

    生成路由:
    postsGET/admin/posts(.:format){:controller=>"posts", :action=>"index"}
    postsPOST/admin/posts(.:format){:controller=>"posts", :action=>"create"}
    new_postGET/admin/posts/new(.:format){:controller=>"posts", :action=>"new"}
    edit_postGET/admin/posts/:id/edit(.:format){:controller=>"posts", :action=>"edit"}
    postGET/admin/posts/:id(.:format){:controller=>"posts", :action=>"show"}
    postPUT/admin/posts/:id(.:format){:controller=>"posts", :action=>"update"}
    postDELETE/admin/posts/:id(.:format){:controller=>"posts", :action=>"destroy"}

    Ruby代码
    1. scope :module => 'admin' do  
    2.   resources :posts  
    3. end  
    4. # 相当于:  
    5. resources :posts:module => 'admin'  

    生成路由:
    postsGET/posts(.:format){:controller=>"admin/posts", :action=>"index"}
    postsPOST/posts(.:format){:controller=>"admin/posts", :action=>"create"}
    new_postGET/posts/new(.:format){:controller=>"admin/posts", :action=>"new"}
    edit_postGET/posts/:id/edit(.:format){:controller=>"admin/posts", :action=>"edit"}
    postGET/posts/:id(.:format){:controller=>"admin/posts", :action=>"show"}
    postPUT/posts/:id(.:format){:controller=>"admin/posts", :action=>"update"}
    postDELETE/posts/:id(.:format){:controller=>"admin/posts", :action=>"destroy"}

    Ruby代码
    1. scope :name_prefix => 'admin' do  
    2.   resources :posts  
    3. end  
    4. # 相当于:  
    5. resources :posts:name_prefix => 'admin'  

    生成路由:
    admin_postsGET/posts(.:format){:controller=>"posts", :action=>"index"}
    admin_postsPOST/posts(.:format){:controller=>"posts", :action=>"create"}
    new_admin_postGET/posts/new(.:format){:controller=>"posts", :action=>"new"}
    edit_admin_postGET/posts/:id/edit(.:format){:controller=>"posts", :action=>"edit"}
    admin_postGET/posts/:id(.:format){:controller=>"posts", :action=>"show"}
    admin_postPUT/posts/:id(.:format){:controller=>"posts", :action=>"update"}
    admin_postDELETE/posts/:id(.:format){:controller=>"posts", :action=>"destroy"}

    Ruby代码
    1. scope 'admin':module => 'admin':name_prefix => 'admin' do  
    2.   resources :posts  
    3. end  
    4. # 相当于:  
    5. namespace 'admin' do   
    6.   resources :posts  
    7. end  

    生成路由:
    admin_postsGET/admin/posts(.:format){:controller=>"admin/posts", :action=>"index"}
    admin_postsPOST/admin/posts(.:format){:controller=>"admin/posts", :action=>"create"}
    new_admin_postGET/admin/posts/new(.:format){:controller=>"admin/posts", :action=>"new"}
    edit_admin_postGET/admin/posts/:id/edit(.:format){:controller=>"admin/posts", :action=>"edit"}
    admin_postGET/admin/posts/:id(.:format){:controller=>"admin/posts", :action=>"show"}
    admin_postPUT/admin/posts/:id(.:format){:controller=>"admin/posts", :action=>"update"}
    admin_postDELETE/admin/posts/:id(.:format){:controller=>"admin/posts", :action=>"destroy"}


    在路由中定义跳转:
    Ruby代码
    1. match "/posts/github" => redirect("http://github.com/rails.atom")  
    2.   
    3. # 地址 /foo/1 会自动跳转到 /bar/1s  
    4. match "/foo/:id":to => redirect("/bar/%{id}s")    
    5.   
    6. # /account/proc/inosin 会自动跳转到 /inosins  
    7. match 'account/proc/:name':to => redirect {|params|   
    8. "/#{params[:name].pluralize}" }  
    9.   
    10. match "/stories" => redirect {|p, req| "/posts/#{req.subdomain}" }   


    路由中的限制:
    Ruby代码
    1. # 限制 id 只能为数字  
    2. match "/posts/show/:id":to => "posts#index":id => /\d+/  
    3. match "/posts/show/:id":to => "posts#index":constraints => {:id => /\d+/}  
    4.   
    5. # 限制子域名  
    6. match "photos":constraints => {:subdomain => "admin"}   
    7.   
    8. # 限制访问者 IP  
    9. constraints(:ip => /127.0.0.1/) do  
    10.   match  '/questions':to => redirect("http://www.stackoverflow.com/")  
    11. end  
    12.   
    13. # 当访问者 ip 是 192.168.1.* 的来访者访问 子域名为 "test"  
    14. match "/ttt" => proc{|env| [200, {}, ["hello test"]]}, \  
    15.     :constraints => {:subdomain => "test":ip => /192\.168\.1\.\d+/}   


    路由通配符:
    Ruby代码
    1. resources :photos:id => /\d+/  
    2. match 'photos/*other' => 'photos#unknown'  
    3. #上面这两行路由则会把不符合7种path的其他url全部解析到PhotoController#unknown中去处理,params[:other]可得到path中/photos/之后的部分,注意这两行的顺序不能颠倒  
    4.   
    5. match 'books/*section/:title' => 'books#show'   
    6. # 例如:books/some/section/last-words-a-memoir 中 params[:section] = "some/section", params[:title] = "last-words-a-memoir".  
    7.   
    8. match '*a/foo/*b' => 'test#index'   
    9. # 例如:zoo/woo/foo/bar/baz 中 params[:a] = "zoo/woo", params[:b] = "bar/baz"  


    Rack:
    Ruby代码
    1. match "/foo":to => proc {|env| [200, {}, ["Hello world"]] }  
    2.    
    3. match 'rocketeer.js' => ::TestRoutingMapper::RocketeerApp  
    4.    
    5. RocketeerApp = lambda { |env|  
    6.   [200, {"Content-Type" => "text/html"}, ["javascripts"]]  
    7. }  


    参考文档:
    http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/
    http://www.railsdispatch.com/posts/rails-routing
    http://guides.rails.info/routing.html
    http://asciicasts.com/episodes/203-routing-in-rails-3
    http://asciicasts.com/episodes/231-routing-walkthrough
    http://asciicasts.com/episodes/232-routing-walkthrough-part-2
  • 相关阅读:
    java笔试之输出
    构造块和静态块[转]
    Java 对象和类
    StringBuffer
    基于bootstrap的表格数据展示
    弹窗式页面
    读取xml
    更新xml
    写XML
    遍历一个类的字段和值
  • 原文地址:https://www.cnblogs.com/lexus/p/1905285.html
Copyright © 2011-2022 走看看