第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:いつもなら見逃してるような気もする