码迷,mamicode.com
首页 > 其他好文 > 详细

【转】Rails3 Route用法集锦

时间:2015-04-19 17:55:30      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

原文链接:http://inosin.iteye.com/blog/786467

默认路由:

# Rails3:
match /:controller(/:action(/:id))
# Rails2:
map.connect :controller/:action/:id

正则路由:

# Rails3:
match products/:id, :to => catalog#view
# Rails2:
map.connect products/:id, :controller => catalog, :action => view

命名路由:

# Rails3:
match logout, :to => sessions#destroy, :as => logout
# Rails2:
map.logout logout, :controller => sessions, :action => ‘‘

根路由:

# Rails3:
root :to => welcome#show
# Rails2:
map.root :controller => welcome, :action => show

路由简写技巧:
:to 键的省略:

match account => account#index
# 相当于:
match account, :to => account#index

match info => projects#info, :as => info

 

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

当路径和控制器(及action)一至时,可省略指派控制器部分

match account/overview
# 相当于:
match account/overview, :to => account#overview

Verb路由
当需要限制http请求方法的时候通过键 :via ,也可以直接把方法写在最前面:

get account/overview
# 相当于:
match account/overview, :via => get

match account/setup, :via => [:get, :post]
# 支持get\post\put\delete四种HTTP方法


resources路由:

resources :posts, :except => [:index]
resources :posts, :only => [:new, :create]

# edit_post GET    /posts/:id/modify(.:format) {:controller=>"posts", :action=>"edit"}
resources :posts, :path_names => { :edit => modify } 

resources :projects do
  resources :tasks, :people
end

resources :products do
  collection do
    get  :sold
    post :on_offer, :search
  end
  get :buy, :on => :member
  post :batch, :on => :collection
end

resource :session do
  get :create
end

:shallow用法:
Rails3中的shallow用法与Rails2中一致

resources :blogs, :shallow => true do
  resources :comments
end


使用:shallow前后相同部分:

blog_comments GET /blogs/:blog_id/comments(.:format) {:controller=>"comments", :action=>"index"}
blog_comments POST /blogs/:blog_id/comments(.:format) {:controller=>"comments", :action=>"create"}
new_blog_comment GET /blogs/:blog_id/comments/new(.:format) {:controller=>"comments", :action=>"new"}
blogs GET /blogs(.:format) {:controller=>"blogs", :action=>"index"}
blogs POST /blogs(.:format) {:controller=>"blogs", :action=>"create"}
new_blog GET /blogs/new(.:format) {:controller=>"blogs", :action=>"new"}
edit_blog GET /blogs/:id/edit(.:format) {:controller=>"blogs", :action=>"edit"}
blog GET /blogs/:id(.:format) {:controller=>"blogs", :action=>"show"}
blog PUT /blogs/:id(.:format) {:controller=>"blogs", :action=>"update"}
blog DELETE /blogs/:id(.:format) {:controller=>"blogs", :action=>"destroy"} 

使用:shallow前后不同部分: 不使用shallow选项:

edit_blog_comment GET /blogs/:blog_id/comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"}
blog_comment GET /blogs/:blog_id/comments/:id(.:format) {:controller=>"comments", :action=>"show"}
blog_comment PUT /blogs/:blog_id/comments/:id(.:format) {:controller=>"comments", :action=>"update"}
blog_comment DELETE /blogs/:blog_id/comments/:id(.:format) {:controller=>"comments", :action=>"destroy"}

使用shallow选项后:

edit_comment GET /comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"}
comment GET /comments/:id(.:format) {:controller=>"comments", :action=>"show"}
comment PUT /comments/:id(.:format) {:controller=>"comments", :action=>"update"}
comment DELETE /comments/:id(.:format) {:controller=>"comments", :action=>"destroy"}

可以看出使用shallow选项后,对于已经存在的资源使用简化方式操作,具体行为涉及到 edit\show\update\destroy 四种 另外,shallow选项的有效范围是对自身及嵌套的资源都有效,如下面这个例子:

 

resources :publishers do
  resources :magazines do
    resources :albums, :shallow => true do
      resources :photos do
        resources :images
      end
    end
  end
end

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

scope路由
:path 改变Path,:module 改变Controller, :name_prefix || :as 改变  helper

scope admin do
  resources :posts
end
# 行当于:
scope :path => admin do
  resources :posts
end


生成路由:

posts GET /admin/posts(.:format) {:controller=>"posts", :action=>"index"}
posts POST /admin/posts(.:format) {:controller=>"posts", :action=>"create"}
new_post GET /admin/posts/new(.:format) {:controller=>"posts", :action=>"new"}
edit_post GET /admin/posts/:id/edit(.:format) {:controller=>"posts", :action=>"edit"}
post GET /admin/posts/:id(.:format) {:controller=>"posts", :action=>"show"}
post PUT /admin/posts/:id(.:format) {:controller=>"posts", :action=>"update"}
post DELETE /admin/posts/:id(.:format) {:controller=>"posts", :action=>"destroy"}

 

 

scope :module => admin do
  resources :posts
end
# 相当于:
resources :posts, :module => admin

生成路由:

posts GET /posts(.:format) {:controller=>"admin/posts", :action=>"index"}
posts POST /posts(.:format) {:controller=>"admin/posts", :action=>"create"}
new_post GET /posts/new(.:format) {:controller=>"admin/posts", :action=>"new"}
edit_post GET /posts/:id/edit(.:format) {:controller=>"admin/posts", :action=>"edit"}
post GET /posts/:id(.:format) {:controller=>"admin/posts", :action=>"show"}
post PUT /posts/:id(.:format) {:controller=>"admin/posts", :action=>"update"}
post DELETE /posts/:id(.:format) {:controller=>"admin/posts", :action=>"destroy"}

 

 

scope :name_prefix => admin do
  resources :posts
end
# 相当于:
resources :posts, :name_prefix => admin

 

生成路由:

admin_posts GET /posts(.:format) {:controller=>"posts", :action=>"index"}
admin_posts POST /posts(.:format) {:controller=>"posts", :action=>"create"}
new_admin_post GET /posts/new(.:format) {:controller=>"posts", :action=>"new"}
edit_admin_post GET /posts/:id/edit(.:format) {:controller=>"posts", :action=>"edit"}
admin_post GET /posts/:id(.:format) {:controller=>"posts", :action=>"show"}
admin_post PUT /posts/:id(.:format) {:controller=>"posts", :action=>"update"}
admin_post DELETE /posts/:id(.:format) {:controller=>"posts", :action=>"destroy"}


 

scope admin, :module => admin, :name_prefix => admin do
  resources :posts
end
# 相当于:
namespace admin do 
  resources :posts
end

 

生成路由:

admin_posts GET /admin/posts(.:format) {:controller=>"admin/posts", :action=>"index"}
admin_posts POST /admin/posts(.:format) {:controller=>"admin/posts", :action=>"create"}
new_admin_post GET /admin/posts/new(.:format) {:controller=>"admin/posts", :action=>"new"}
edit_admin_post GET /admin/posts/:id/edit(.:format) {:controller=>"admin/posts", :action=>"edit"}
admin_post GET /admin/posts/:id(.:format) {:controller=>"admin/posts", :action=>"show"}
admin_post PUT /admin/posts/:id(.:format) {:controller=>"admin/posts", :action=>"update"}
admin_post DELETE /admin/posts/:id(.:format) {:controller=>"admin/posts", :action=>"destroy"}

 

在路由中定义跳转:

 

match "/posts/github" => redirect("http://github.com/rails.atom")

# 地址 /foo/1 会自动跳转到 /bar/1s
match "/foo/:id", :to => redirect("/bar/%{id}s")  

# /account/proc/inosin 会自动跳转到 /inosins
match account/proc/:name, :to => redirect {|params| 
"/#{params[:name].pluralize}" }

match "/stories" => redirect {|p, req| "/posts/#{req.subdomain}" } 

 

路由中的限制:

 

# 限制 id 只能为数字
match "/posts/show/:id", :to => "posts#index", :id => /\d+/
match "/posts/show/:id", :to => "posts#index", :constraints => {:id => /\d+/}

# 限制子域名
match "photos", :constraints => {:subdomain => "admin"} 

# 限制访问者 IP
constraints(:ip => /127.0.0.1/) do
  match  /questions, :to => redirect("http://www.stackoverflow.com/")
end

# 当访问者 ip 是 192.168.1.* 的来访者访问 子域名为 "test"
match "/ttt" => proc{|env| [200, {}, ["hello test"]]},     :constraints => {:subdomain => "test", :ip => /192\.168\.1\.\d+/} 

 

路由通配符:

 

resources :photos, :id => /\d+/
match photos/*other => photos#unknown
#上面这两行路由则会把不符合7种path的其他url全部解析到PhotoController#unknown中去处理,params[:other]可得到path中/photos/之后的部分,注意这两行的顺序不能颠倒

match books/*section/:title => books#show 
# 例如:books/some/section/last-words-a-memoir 中 params[:section] = "some/section", params[:title] = "last-words-a-memoir".

match *a/foo/*b => test#index 
# 例如:zoo/woo/foo/bar/baz 中 params[:a] = "zoo/woo", params[:b] = "bar/baz"

 

Rack:

 

match "/foo", :to => proc {|env| [200, {}, ["Hello world"]] }
 
match rocketeer.js => ::TestRoutingMapper::RocketeerApp
 
RocketeerApp = lambda { |env|
  [200, {"Content-Type" => "text/html"}, ["javascripts"]]
}

 

【转】Rails3 Route用法集锦

标签:

原文地址:http://www.cnblogs.com/jqiong/p/4439469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!