第16章 ActionController
ルーティング
サーバーにURLがリクエストされたとき、そのリクエストをどのコントローラーのどのアクションに割り振るかの設定。つまるところmod_rewrite見たいな感じ。config/route.rbで設定する。
- map.connect : このメソッドでルーティングを設定する。
- :default => { :name => "value" }
- :requirements => { :name => /regexp/ }
- :name => value
- :name => /regexp/
URLの生成
- url_for :URLの生成を行なう。RailsにURLを格納するときはすべてこのメソッドを通して作成する。(一部のメソッドでは内部的に使われている)
- :controller
- :action
- default_url_options : コントローラにこのメソッドを作成することによりパラメータのデフォルト値を設定することが出来る。
- :anchor
- :host
- :only_path
- :protocol : "https"
- :trailing_slash : 末尾にスラッシュをつけるか否か
- xxx_url : ルーティングのところで作成したルーティング名が自動的にxxxを置き換えたメソッドを作成する。頻繁にアクセスするURLなどにはこれを使う
コントローラーの環境
コントローラで使える変数など。
- request
- domain()
- remote_jp()
- env()
- method()
- :delete
- :get
- :head
- :post
- :put
- delete?
- get?
- head?
- post?
- put?
- params
- cookies
- response
- session
- headers
レンダリング
リクエストに対するサーバーのレスポンスは3種類あって、
- テンプレートを処理してレンダリングした結果を返す
- 文字列を返す
- データストリームを返す
があるそうな。
レンダリングのテンプレートには2種類あって、rhtmlというやつとbuilderという奴があるらしい。標準はrhtmlでERBを使ったテンプレート。
- render() : テンプレートファイルなどを指定するメソッド。
- :text
- :inline
- :type : "rhtml" or "rxml"
- :action
- :file
- :template : ex. "controller_name/action_name"
- :partial
- :status
- :layout
- send_data() : データストリームを返す
- send_file() : ファイルを返す。send_data()との挙動の違いが分からない。(ストリーミングが出来るか否か?)
- :filename
- :type
- :disposition : "inline" or "attachment"
セッション
コントローラの先頭か、app/controllers/apprication.rbで宣言。
セッションの設定
- ActionController::Base.session_options[]
- :session_domain
- :session_id
- :session_key
- :session_path
- :session_secure
フィルタ
ActiveRecordのコールバックと似たような感じ。レンダリングする前後で処理を行なわせることが出来る。コントローラーを継承すればフィルタも継承されるというのがすごいと思った。
- before_filter
- after_filter
- :only
- :except
- around_filter : 他のやつとは使い方が違うので注意。before()、after()を定義する。
- verify() : わざわざフィルタメソッドを定義しなくても頻出する処理はこれで処理できる。
- :only
- :except
- :flash
- :method
- :params
- :session
- :add_flash
- :redirect_to
キャッシュ
ここを適切に設定することでサーバーの負荷が大幅に変わってきそう。キャッシュには3種類ある。
- ページキャッシュ : 静的なHTMLを用意するため一番効果が高い
- cache_page
- expire_page
- アクションキャッシュ
- caches_action
- expire_action
- フラグメントキャッシュ
スイーパ
各コントローラにキャッシュの処理を書くと分散してしまうのでスイーパクラスを作ることでまとめて記述できる。ActionController::Caching::Sweeperクラスを継承し、「observer モデル名」で監視対象のモデルを書く。コントローラー側にはcache_sweeperを書く。
今まで何をやらせれば良いかわからなかったControllerの仕事が分かったような気がする。本って素晴らしい!!