Ruby on Rails 3 アプリケーションプログラミング(7/9)
ルーティング
現在のルート定義を確認する
$ rake routes ajax_index GET /ajax/index(.:format) ajax#index fun_comments GET /fun_comments(.:format) fun_comments#index POST /fun_comments(.:format) fun_comments#create new_fun_comment GET /fun_comments/new(.:format) fun_comments#new edit_fun_comment GET /fun_comments/:id/edit(.:format) fun_comments#edit ...
RESTful なインターフェース
HTTPメソッドでCRUDを表現
リソースを…
- 取得する GET (Read)
- 作成する POST (Create)
- 更新する PUT (Update)
- 削除する DELETE (Delete)
- config/routes.rb に記述
resources :リソース名 | 複数形 | 一覧表示、登録、更新、削除等CRUD |
resource :リソース名 | 単数形 | Config情報などシステム唯一のデータ管理に |
- ルートパラメータの制約条件
- :constraints => {:パラメータ名 => 正規表現パターン }
ex)
resources :books, :constraints => {:id => /[0-9]{1,2}/}
- 制約クラスの定義
ex) app/models/TimeConstraint.rb 9時から18時までルーティングを有効化、業務アプリに使えそう!
class TimeConstraint def matches?(request) current = Time.now current.hour >= 9 && current.hour < 18 end
上記をconfig/routes.rb に組み込み
require 'TimeConstraint' Railbook::Application.routes.draw do ... resources :books, :constraints => TimeConstraint.new ...
- コントローラクラス/URLヘルパの名前を修正
- 内部的に別名で処理
resources :users, :controller => 'members'
usersコントローラにアクセスしていると見せかけて、内部ではmembersコントローラにマッピング。
resources :users, :as => 'members'
上記に加え(?)URLヘルパも対応。users_path や user_path は members_path、member_path にマッピング。
- モジュール配下のコントローラをマッピング
たとえば Administrator 専用のコントローラを作った場合↓
rails g controller Admin::Books
Admin::BooksController が app/controllers/admin/books_controller.rb に作成される。
上記クラスにアクセスするには以下のようにルーティングすれば良い。
... namespace 'admin' do resources :books end ...
$ rake routes ... admin_books GET /admin/books(.:format) admin/books#index POST /admin/books(.:format) admin/books#create new_admin_book GET /admin/books/new(.:format) admin/books#new edit_admin_book GET /admin/books/:id/edit(.:format) admin/books#edit admin_book GET /admin/books/:id(.:format) admin/books#show PUT /admin/books/:id(.:format) admin/books#update DELETE /admin/books/:id(.:format) admin/books#destroy
モジュールとして認識させるだけの場合は scope ブロックを使う。
... scope :module => 'admin' do resources :books end ...
$ rake routes | grep admin GET /books(.:format) admin/books#index POST /books(.:format) admin/books#create GET /books/new(.:format) admin/books#new GET /books/:id/edit(.:format) admin/books#edit GET /books/:id(.:format) admin/books#show PUT /books/:id(.:format) admin/books#update DELETE /books/:id(.:format) admin/books#destroy
- 指定したアクションを無効にする
- :except => ['アクション名']
- 指定したアクションのみを有効にする
- :only => ['アクション名']
- 階層構造を持ったリソースの表現
- 書籍1に対するレビューを 〜books/1/reviews のように表現
resources :books do resources :reviews end
$ rake routes | grep reviews reviews GET /reviews(.:format) reviews#index POST /reviews(.:format) reviews#create new_review GET /reviews/new(.:format) reviews#new edit_review GET /reviews/:id/edit(.:format) reviews#edit review GET /reviews/:id(.:format) reviews#show PUT /reviews/:id(.:format) reviews#update DELETE /reviews/:id(.:format) reviews#destroy book_reviews GET /books/:book_id/reviews(.:format) reviews#index POST /books/:book_id/reviews(.:format) reviews#create new_book_review GET /books/:book_id/reviews/new(.:format) reviews#new edit_book_review GET /books/:book_id/reviews/:id/edit(.:format) reviews#edit book_review GET /books/:book_id/reviews/:id(.:format) reviews#show PUT /books/:book_id/reviews/:id(.:format) reviews#update DELETE /books/:book_id/reviews/:id(.:format) reviews#destroy
非RESTfulなルート定義
- 基本
- match ':controller(/:action(/:id(.:format)))'
- match '/:locale' => 'books#index'
- ルートへのマッピング
- root :to => 'books#index'
- index.htmlがあるとそっちが優先されるらしい
- root :to => 'books#index'
ルートの優先順位について
ファーストヒットで決まる。
match ':controller(/:action(/:id(.:format)))' のような汎用な指定は routes.rb の末尾で定義すること。