Rails3 Route 常用用法
我们都知道在 Rails 中的 config/route.rb 文件定义了路由的设定,这次充分学习了 Rails3 中 Route 的常用用法,整理并分享在这里。
默认路由
match '/:controller(/:action(/:id))'
自定义路由
match 'products/:id', :to => 'catalog#view'
命名路由
match 'logout', :to => 'sessions#destroy', :as => 'logout'
根路由
root :to => 'welcome#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 方法
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"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Sublime Text 2 常用插件
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论