AWDwR "Chapter16 Action Controller and Rails"
Action Controller 行きます。
Routing Requests
config/route.rbにリクエストされたURLをどのようにコントローラやアクション等にマッピングするかを記述する。例えば
map.connect ':controller/:action/:id'
とすると、store/add_to_cart/123というURLは
@params = {:controller=>'store', :action=>'add_to_cart', :id=>'123'}
とマッピングされる。
map.connectのオプションは以下の通り。
- :defaults=>{:name=>'value',...} パラメタがなかった場合のデフォルト値
- :requirements=>{:name=>/regexp/,...} マッチした場合のみこのマップが適用される
- :name=>value 指定したパラメタに値をセットする
- :name=>/reqexp/ 指定したパラメタがマッチした場合のみこのマップが適用される
逆にパラメタを与えるとマッピング情報に基づいてURLを生成するのがurl_for()というメソッド。例えば
url_for(:controller=>'store', :action=>'add_to_cart', :id=>123) #=> http://www.foo.com/store/add_to_cart/123
となる。指定されないパラメタがあった場合は現在のリクエストのURLがデフォルト値として使われる。
url_forのオプションは以下の通り。
- :anchor アンカー名を指定する
- :host ホスト名とポート番号を指定する
- :only_path パスのみ生成する
- :protocol プロトコルを指定する
- :trailing_slash 生成したURLに/を追加する
map.connectの代わりにmap.index等とするとマッピングに名前をつけることができ、URLの生成も[マッピング名]_urlというメソッドで行なえるようになってわかりやすくなる。
Action Methods
コントローラオブジェクト内にアクション名と同じ名前のメソッドがあればそれが呼ばれ、それがない場合はmethod_missing()が呼ばれ、それがない場合はテンプレートがレンダリングされ、それもない場合はUnknown Actionエラーが生成される。
コントローラは以下のようなインスタンス変数をセットアップする。
- request
- リクエストオブジェクト
- domain() ドメイン名の最後の2つの部分
- remote_ip() リモートIPアドレス
- env() ブラウザによって設定された環境情報
- method リクエストメソッド
- delete?,get?,head?,post?,put? そのリクエストメソッドかどうか
- params
- リクエストパラメタ
- cookies
- クッキー
- response
- レスポンスオブジェクト
- session
- セッションオブジェクト
- headers
- HTTPヘッダ。デフォルトでCache-Controlはno-cacheに設定されている。
レスポンスの返し方は3通り。テンプレートをレンダリングする方法、コントローラが直接文字列を返す方法、データやファイルの内容を返す方法。
Railsはrhtmlとbuilderの2つのテンプレートフォーマットを持っていて、render()メソッドによってレンダリングされる。
- render(:text=>string) 文字列を送信する
- render(:inline=>string) 文字列をテンプレートとして解釈する
- render(:action=>action_name) 指定されたアクションのテンプレートをレンダリングする
- render(:file=>path) 指定されたファイルのテンプレートをレンダリングする
- render(:template=>name) 相対パスで指定されたテンプレートをレンダリングする
- render(:partial=>name) パーシャルテンプレートをレンダリングする
- render(:nothing=>true) 空のボディを送信する
- render() デフォルトのテンプレートをレンダリングする
statusパラメタで返すステータスヘッダを設定することができ、また:layoutパラメタにnilまたはtrueをセットするとレイアウトが適用される。
データを送信する場合はsend_data()。ファイルの内容を送信する場合はsend_file()。
リダイレクトする場合はredirect_to()メソッドを使う。
- redirect_to(path) 指定されたパスにリダイレクトさせる
- redirect_to(url) 指定されたURLにリダイレクトさせる