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