Quick Tour of Routes.rb を読んだ
railsのルートが良く分からないからhttp://guides.rubyonrails.org/routing_outside_in.html
を読んだ
Quick Tour of Routes.rb
http://guides.rubyonrails.org/routing_outside_in.html
1. The Dual Purpose of Routing
リクエストのときとレスポンスのときの双方向でつかうよ
2. Quick Tour of Routes.rb
ルートの種類は下記の5種類
RESTful Routes
Named Routes
Nested Routes
Regular Routes
Default Routes
routes.rbの評価
上に書いたものが優先される
(上から評価して最初にマッチしたものが採用)
マッチしなかったら404エラー
RESTful Routes
RESTfulなルートを1発で定義。詳細は3. RESTful Routing: the Rails Defaultで
こんな感じ
map.resources :books
Named Routes
まあ見て分かるけど、map.loginの"login"とこがNamedってこと?
こんな感じ
map.login '/login', :controller => 'sessions', :action => 'new
Nested Routes
ネストしたルート。詳細は3.8. Nested Resourcesで
map.resources :assemblies do |assemblies| assemblies.resources :parts end
Regular Routes
RESTfulじゃないルート。普通これ。分かりやすい
map.connect 'parts/:number', :controller => 'inventory', :action => 'show'
Default Routes
自動的に最後に書かれるルート。普通のRESTfulじゃないやつはだいたいここでマッチする
全部RESTfulでやるなら消してもOK
map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format'
3.2. CRUD, Verbs, and Actions
RESTfulなルートはHTTPのメソッドに対応してる。
たとえば、
map.resources :photos
って書くと、
HTTPのメソッド | URL | 呼ばれるcontroller | 呼ばれるaction | 用途 |
---|---|---|---|---|
GET | /photos | Photos | index | photoの一覧表示 |
GET | /photos/new | Photos | new | photo作成画面表示 |
POST | /photos | Photos | create | 新規photo作成処理 |
GET | /photos/1 | Photos | show | 指定のphoto表示 |
GET | /photos/1/edit | Photos | edit | photo編集画面表示 |
PUT | /photos/1 | Photos | update | 指定のphoto更新処理 |
DELETE | /photos/1 | Photos | destroy | 指定のphoto削除処理 |
ができる。
3.3. URLs and Paths
RESTfulなルートを定義すると下記のurlとpathが使えるようになる
photos_url と photos_path は index と create アクション(HTTPのメソッドで違う)
new_photo_url と new_photo_path は new アクション
edit_photo_url と edit_photo_path は edit アクション
photo_url と photo_path は show, update, and destroy アクション(HTTPのメソッドで違う)
_urlがついてるのはフルパス。_pathは相対パス。
こんな感じ
photos_url # => "http://www.example.com/photos" photos_path # => "/photos"
3.4. Defining Multiple Resources at the Same Time
書くのがめんどかったら1行でかける
map.resources :photos, :books, :videos
map.resources:
だと全部???わからん
3.5. Singular Resources
(シングルトンあんまりつかわなそうだから適当に省略
てかシングルトンのモデルが作れるのをはじめて知った)
シングルトンのリソースにRESTfulなルートを定義するときは
こんな感じ。map.resourceが単数形ね。
map.resource :geocoder
マップされるパスはmap.resourcesで定義されるののIDがない版になる。
コントローラーは複数形のまま。
生成されるurlとpathは
new_geocoder_url 、 new_geocoder_path
edit_geocoder_url 、 edit_geocoder_path
geocoder_url 、 geocoder_path
3.6. Customizing Resources
RESTfulなルートはいろいろカスタマイズできるよ
3.6.1. Using :controller
:controllerを使うと、別のコントローラーをつかえる
こんな感じ
map.resources :photos, :controller => "images"
マップされるパスは呼び出されるコントローラーが違うだけ。
でも、生成されるurlとpathはphotos_path, new_photo_pathとかで、
images_path, new_image_pathじゃないよ
3.7. Controller Namespaces and Routing
めんどいから省略。いろいろできる。
3.7.8. Using :only and :except
- only と
- except オプションで、HTTPメソッドを限定できる
map.resources :photos, :only => [:index, :show] index, showアクションだけに限定する
map.resources :photos, :except => :destroy
destroyだけOKにする
3.8. Nested Resources
たとえば親子関係にあるこんな感じのモデルで、
class Magazine < ActiveRecord::Base has_many :ads end class Ad < ActiveRecord::Base belongs_to :magazine end
こんな感じでルート定義すると
map.resources :magazines do |magazine| magazine.resources :ads end
こんな感じで子のモデルを操作するためのルートが定義される。
用途は見て分かるから省略。
HTTPのメソッド | URL | 呼ばれるcontroller | 呼ばれるaction |
---|---|---|---|
GET | /magazines/1/ads | Ads | index |
GET | /magazines/1/ads/new | Ads | new |
POST | /magazines/1/ads | Ads | create |
GET | /magazines/1/ads/1 | Ads | show |
GET | /magazines/1/ads/1/edit | Ads | edit |
PUT | /magazines/1/ads/1 | Ads | update |
DELETE | /magazines/1/ads/1 | Ads | destroy |
生成されるurlとpathは
magazine_ads_url とか edit_magazine_ad_pathとかな感じで
あといろいろ省略
4. Regular Routes
簡単だからいろいろ省略
4.6. Named Routes
こんな感じで名前付きのルートが作れる。
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
これだと、logout_path と logout_urlが使える。
4.7. Route Requirements
:requirementsオプションでルートのパラメータの形式を指定できる
こんな感じ
map.connect 'photo/:id', :controller => 'photos', :action => 'show', :requirements => { :id => /[A-Z]\d{5}/ }
もっと短くこんな感じにも書ける
map.connect 'photo/:id', :controller => 'photos', :action => 'show', :id => /[A-Z]\d{5}/
4.9. Route Globbing
ルートにGlobが使える。
複数のパラメータを指定するときに使う用
こんな感じにすると
map.connect 'photo/*other', :controller => 'photos', :action => 'unknown',
photo/よりあとの部分が分解されて
params[:other]に配列でパラメータが入るみたい
photo/12
だとparams[:other]=[12] かな??
/photo/long/path/to/12
だとparams[:other]=['long','path','to',12]
見たいな感じになる???(やってみないとわからん)
いろいろ省略
7.1. Using map.root
rootのパスをマップする
map.root :controller => "pages", :action => "main"
8.1. Seeing Existing Routes with rake
rake routes
で定義されたルートを見れるよ
あと省略