207 lines
5.0 KiB
Markdown
207 lines
5.0 KiB
Markdown
---
|
|
title: Routes
|
|
category: Rails
|
|
---
|
|
|
|
## Resources
|
|
|
|
### Multiple resources (`resources`)
|
|
|
|
resources :photos
|
|
|
|
# PhotosController:
|
|
# index => GET /photos
|
|
# new => GET /photos/new
|
|
# create => POST /photos/new
|
|
# show => GET /photos/:id
|
|
# edit => GET /photos/:id/edit
|
|
# update => PUT /photos/:id
|
|
# delete => DELETE /photos/:id
|
|
#
|
|
# Helpers:
|
|
# new_photo_path
|
|
# photo_path(id)
|
|
# edit_photo_path(id)
|
|
|
|
### Custom actions
|
|
|
|
resources :photos do
|
|
member { get 'preview' } # /photo/1/preview
|
|
collection { get 'search' } # /photos/search
|
|
|
|
get 'preview', on: :member # (..same as the first)
|
|
end
|
|
|
|
### Options
|
|
|
|
resources :photos,
|
|
path_names: { new: 'brand_new' } # /photos/1/brand_new
|
|
path: 'postings' # /postings
|
|
only: :index
|
|
only: [:index, :show]
|
|
except: :show
|
|
except: [:index, :show]
|
|
|
|
shallow: true # also generate shallow routes
|
|
shalow_path: 'secret'
|
|
shallow_prefix: 'secret'
|
|
|
|
## Single resource (`resource`)
|
|
|
|
resource :coder
|
|
|
|
# CodersController:
|
|
# new => GET /coder/new
|
|
# create => POST /coder/new
|
|
# show => GET /coder
|
|
# edit => GET /coder/edit
|
|
# update => PUT /coder
|
|
# delete => DELETE /coder
|
|
|
|
## Matching (`match`)
|
|
|
|
match 'photo/:id' => 'photos#show' # /photo/what-is-it
|
|
match 'photo/:id', id: /[0-9]+/ # /photo/0192
|
|
match 'photo/:id' => 'photos#show', constraints: { id: /[0-9]+/ }
|
|
match 'photo/:id', via: :get
|
|
match 'photo/:id', via: [:get, :post]
|
|
|
|
match 'photo/*path' => 'photos#unknown' # /photo/what/ever
|
|
|
|
# params[:format] == 'jpg'
|
|
match 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' }
|
|
|
|
### Get/post
|
|
|
|
`get` is the same as `match via: :get`.
|
|
|
|
get 'photo/:id' => 'photos#show'
|
|
# same as match 'photo/:id' => 'photos#show', via: :get
|
|
|
|
post 'photo/:id' => 'photos#update'
|
|
# same as match 'photo/:id' => 'photos#show', via: :post
|
|
|
|
### Redirection
|
|
|
|
match '/stories' => redirect('/posts')
|
|
match '/stories/:name' => redirect('/posts/%{name}')
|
|
|
|
### Named
|
|
|
|
# logout_path
|
|
match 'exit' => 'sessions#destroy', as: :logout
|
|
|
|
### Constraints
|
|
|
|
match '/', constraints: { subdomain: 'admin' }
|
|
|
|
# admin.site.com/admin/photos
|
|
namespace 'admin' do
|
|
constraints subdomain: 'admin' do
|
|
resources :photos
|
|
end
|
|
end
|
|
|
|
### Custom constraints
|
|
|
|
class BlacklistConstraint
|
|
def initialize
|
|
@ips = Blacklist.retrieve_ips
|
|
end
|
|
|
|
def matches?(request)
|
|
@ips.include?(request.remote_ip)
|
|
end
|
|
end
|
|
|
|
TwitterClone::Application.routes.draw do
|
|
match "*path" => "blacklist#index",
|
|
:constraints => BlacklistConstraint.new
|
|
end
|
|
|
|
### Scopes
|
|
|
|
scope 'admin', constraints: { subdomain: 'admin' } do
|
|
resources ...
|
|
end
|
|
|
|
### Rack middleware
|
|
|
|
# Yes, Sprockets is middleware
|
|
match '/application.js' => Sprockets
|
|
|
|
### Route helpers
|
|
|
|
projects_path # /projects
|
|
projects_url # http://site.com/projects
|
|
|
|
|
|
### Default help text
|
|
|
|
# The priority is based upon order of creation:
|
|
# first created -> highest priority.
|
|
|
|
# Sample of regular route:
|
|
match 'products/:id' => 'catalog#view'
|
|
|
|
# Keep in mind you can assign values other than :controller and :action
|
|
|
|
# Sample of named route:
|
|
match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
|
|
|
# This route can be invoked with purchase_url(:id => product.id)
|
|
|
|
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
|
resources :products
|
|
|
|
# Sample resource route with options:
|
|
resources :products do
|
|
member do
|
|
get 'short'
|
|
post 'toggle'
|
|
end
|
|
|
|
collection do
|
|
get 'sold'
|
|
end
|
|
end
|
|
|
|
# Sample resource route with sub-resources:
|
|
resources :products do
|
|
resources :comments, :sales
|
|
resource :seller
|
|
end
|
|
|
|
# Sample resource route with more complex sub-resources
|
|
resources :products do
|
|
resources :comments
|
|
resources :sales do
|
|
get 'recent', :on => :collection
|
|
end
|
|
end
|
|
|
|
# Sample resource route within a namespace:
|
|
namespace :admin do
|
|
# Directs /admin/products/* to Admin::ProductsController
|
|
# (app/controllers/admin/products_controller.rb)
|
|
resources :products
|
|
end
|
|
|
|
# You can have the root of your site routed with "root"
|
|
# just remember to delete public/index.html.
|
|
root :to => 'welcome#index'
|
|
|
|
# See how all your routes lay out with "rake routes"
|
|
|
|
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
|
# Note: This route will make all actions in every controller accessible via GET requests.
|
|
match ':controller(/:action(/:id(.:format)))'
|
|
|
|
### References
|
|
|
|
* [Guides/Routing](http://guides.rubyonrails.org/routing.html)
|
|
|
|
* [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)
|
|
(See included modules)
|
|
|