第17章 ActionViewを読む

テンプレート

場所

どこにテンプレートファイルを置くかをtemplate_rootオプションで決めることが出来る。標準では"app/view/"以下。

  • render() : 明示的にテンプレートファイルを指定することも出来る
    • :action
    • :template
    • :file : アプリ間で共有するときに便利らしい。
動作環境

次の変数がテンプレート内で使える

  • controller : テンプレート呼び出しもとのコントローラオブジェクト
  • base_path : テンプレートのベースディレクトリ

他にもいろいろあるがデバッグ時以外はそれらを使うのは非推奨。

Builderテンプレート

XMLを生成するライブラリ。gemsから単独のライブラリとしても使える。XML風言語を生成する際には非常に使えそう。

使い方としてはこんな感じに出来る。

xml.html do
  xml.head do
    xml.title do
    end
  end
  xml.body do
  end
end

メソッド名が<メソッド名>に変換される模様。

Railsではテンプレートファイル拡張子をrxmlとしておくと自動的にこれで処理される。

RHTMLテンプレート

ERBで処理される。テンプレートファイル拡張子はrhtml。
- <% 〜 %>: 改行あり
- <% 〜 -%>: 改行なし

ERBなので何でも出来るが、テンプレートにコードを入り込ませないためになるべくヘルパーを使う。

ヘルパー

XxxxControllerに対して、app/helpers/xxxx_helper.rbのXxxxHelperが対応する。

アプリ全体に適用されるヘルパーはapplication_helper.rbにメソッドを書く。

複数のコントローラ間でhelperを共有したいがアプリ全体にはしたくない場合、対象コントローラでhelper宣言を行なう。

ヘルパーメソッド

Railsに元々用意されているヘルパーメソッドは大量にあるため、一部のみ抜粋する。

リンク作成のヘルパー
  • link_to("text", {:action, :controller }, {:id, :class, :confirm})
    • :confirmはリンク移動する前にJavascriptでメッセージを警告する際のメッセージを入れる。
  • buttom_to : 機能的にはlink_toと同じだが、独立したフォームでボタンを押して移動するリンクを作成する。副作用のあるリンクに使えとのこと。
  • link_to_unless_current : 後で書く部分テンプレートなどで非常に使えそう。
  • auto_discovery_link_tag : 独自に拡張したり出来るのかな?
フォームのヘルパー
  • form_tag
    • :multipart : ファイルのアップロードをするフォームを作成するときに使う
  • text_field
  • hidden_field
  • password_field
    • :variable
    • :attribute
    • options
    • :size
    • :maxsize
  • text_area
    • :cols
    • :rows
  • radio_button
    • :variable
    • :attribute
    • tag_value
    • options

部分テンプレート

Webサイトを作っていると同じようなところの使い回しが非常に多いのでこの機能は非常に助かる。

テンプレートファイルは"_"からはじまるもので、Rubyの変数名となりうるものでないとならない。

テンプレートファイルからrender(:partial => 部分テンプレート)を呼び出すことで使える。


かなり駆け足だったが、Rails本で一番肝となる部分は終わったのではないかと思う。これ以上は実際に何か作りながら参照した方がよさそうだ。

そういえば、今日はtypoっぽいところを2箇所ぐらい発見した。今日は冴えてるような気がする。*1

p.340の真ん中辺り
「コントローラオブジェクトのheaders、params、reques、response、…」は「コントローラオブジェクトのheaders、params、request、response、…」っぽい。(ちゃんと調べてないけど)

p.348の真ん中辺り
「<%=number_with_delimiter(12345678, delimiter = "_") %>」は「<%=number_with_delimiter(12345678, :delimiter => "_") %>」のような気がする。

ということで公式サポートページに登録しておいた。
http://awdwr.shugo.net/errata

*1:いつもなら見逃してるような気もする

第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の仕事が分かったような気がする。本って素晴らしい!!

第14・15章 ActiveRecord

Rails本の勉強メモを書いていきます。

テーブルとモデルの命名規則

テーブル名がモデル名を小文字にして複数形にするという命名規則を無効にするときは、environments.rbでActiveRecord::Base::pluralize_table_namesをfalseにしてしまえばよいらしい。

一時的に変更する場合はモデル側で、

class Model < ActiveRecord::Base
  set_table_name :model

end

といった感じにするらしい。

Boolなデータ

テーブルにBool値を格納する場合、RailsはDBによって様々なようなので、0, "0", "f", "false", "", nilをfalseと判断するらしい。

主キー

Railsでは主キーはidにしておくのが無難。元々idがないテーブルを利用したいときに

class Model < ActiveRecord::Base
  set_primary_key "keyname"
end

とすることは出来るそうだけど、参照は出来ても書き込みは保証しないとか何とか書いてあったような…。

データベースへの接続

Railsとしては特に弄らなそうだけど、ライブラリとしてActiveRecordを使う際には重要そうなところ。

CRUD

Create

コンストラクタはブロックもハッシュも取ることが出来る。オブジェクトを作ったと同時にデータベースに保存したければcreateを使う方がsaveのし忘れがなくて良さそう。

Read

基本的にはfindメソッドで行なう。findメソッドはパラメーターの渡し方によって挙動がかなり違ってややこしい。

  • find(id): idに該当するレコードがなければRecordNotFound例外が発生する。
  • find(:first, ...): 最初の一つのレコードを返す
  • find(:all, ...): 見つかったすべてのレコードを配列で返す
    • :conditions : SQLのwhere句に相当する部分条件を指定する
    • :order : 並び順、詳しい指定の仕方は書いてなかった気がする。
    • :limit : :allのときに使う。いくつまで取ってくるか。
  • find_by_xxxxやfind_all_by_xxxxでも検索できる。

Validation

データのバリデーションはモデルに定義しておけば良いらしい。いろいろなメソッドが用意されてるのだけど、非常に名前が長い気がする。。。もっと短い名前のaliasがほしいと思った。これだけ長いとバリデーション云々の前にtypoする気もする。

メソッドならまだaliasのしようがあるから良いけれど、ハッシュパラメータ*1はaliasが効かないから長いのはつらいような気がする。

(個人的に)よく使いそうなやつを抜き出すと、

  • validates_length_of
    • :is
    • :minimum
    • :maximum
  • validates_numericality_of
  • validates_presence_of

といった感じかな。

コールバック

コールバックは素晴らしいと思った。これにメソッドとかを指定しておけば適切なタイミングで処理を行なってくれるというもの。

いくつかの語彙で整理すると覚えやすそう。

  • validation : beforeのみ。
  • create
  • save
  • update
  • destroy

この語彙とbefore、afterのタイミングで行なえて、その詳しい順番はP.278の図15.4が参考になる。

after_findとafter_initializeはパフォーマンスの関係で使う場合には別途定義する必要があるそうな。

テーブル間の関係(has_many, ...)とか辺りは経験不足のためよく分からなかった。

*1:勝手に造語。引数にハッシュを渡してパラメータとするようなメソッドのことです

RailsによるアジャイルWebアプリケーション開発

RailsによるアジャイルWebアプリケーション開発

RailsによるアジャイルWebアプリケーション開発

買った。