RailsのテンプレートエンジンSlimの書き方とActionViewのヘルパーメソッド、レイアウトの使い方:開発現場でちゃんと使えるRails 4入門(8)(3/3 ページ)
エンタープライズ領域での採用も増えてきたRuby on Railsを使ってWebアプリケーションを作るための入門連載。最新版の4に対応しています。今回は、Railsのテンプレートエンジン「Slim」の書き方やActionViewのヘルパーメソッド、レイアウトの使い方、ビューの実装時に押さえておきたいポイントなどについて。
レイアウトを活用しよう
これまでビューについてBODYタグの中に限定して話が進められてきましたが、その外側は「app/views/layouts/application.htmls.erb」で定義されています。
Railsは各テンプレートのレンダリング結果を「レイアウト」の「yield」メソッドの部分に当てはめ、またレイアウト自身をレンダリングした結果を出力としてレスポンスに乗せています。
レイアウトの変更
レイアウトのテンプレートはコントローラーで以下のように変更できます。
class Admin::BaseController < ApplicationController layout 'admin' end
この「layout」メソッドの宣言により、「Admin::BaseController」のアクションとそれを継承するコントローラーのアクションでレンダリングされるレイアウトは「app/views/layouts」ディレクトリ以下の「admin.html.erb」または「admin.html.slim」が選択されます。
また、この「layout」メソッドはおなじみの「:except」や「:only」のキーにアクション名の配列を渡すことで適用するアクションを指定することもできます。
さらに個別のアクションで次のように「render」メソッドに「layout」オプションを付けることでもレイアウトを指定できます。
class Admin::BaseController < ApplicationController def index @books = Book.all render layout: "admin" end end
レイアウトでよく使うヘルパーメソッド3選
レイアウトの定義で使うヘルパーメソッドについて説明します。
主にHEADタグの中で使われます。
【1】stylesheet_link_tagと【2】javascript_include_tag
引数で指定したスタイルシートやJavaScriptを読み込むLINKタグ・SCRIPTタグを出力します。標準レイアウトの「app/views/layouts/application.html.erb」では以下のように呼び出されています。
<%= stylesheet_link_tag "application", :media => "all" %> <%= javascript_include_tag "application" %>
これにより「/assets/application.css」を「href」属性に持つリンクタグと「/assets/application.js」を「src」属性に持つスクリプトタグが生成されます。
【3】csrf_meta_tags
CSRF対策に使う「csrf-param」と「csrf-token」のMETAタグを生成します。
ビューの実装時に押さえておきたい2つのポイント
最後にビューの実装時に押さえておきたいポイントを紹介します。
【1】「N+1クエリ」問題
N+1はビューで起こりがちなパフォーマンスに関わる問題です。ビューでモデルオブジェクトのコレクションをレコードごとに順に参照することがよくあります。
例として、BookモデルとAuthorモデルがあり、BookモデルがAuthorモデルを参照している場合を考えます。
# コントローラー @books = Book.all # ビュー - @books.each do |book| = book.title = book.author.name
このとき、ビューの最後の行でBookモデルオブジェクトが未ロードのAuthorモデルオブジェクトを呼び出しています。それによって、イテレーションのたびにデータベースへの問い合わせが発生しています。
従って、この処理だけでコントローラーでの1回と@booksの要素数N回のクエリが発生し、パフォーマンスの低下を招きます。
そこで、ActiveRecordの「includes」メソッドにより、あらかじめ関連モデルを読み込んでおくことができます。
@books = Book.includes(:author)
ビューではコレクションのイテレーションを使うことが多いため、この点には注意しましょう。
【2】部分テンプレートの使い方
新規作成フォームと編集フォームは異なるテンプレートを使いますが、「フォームを構成するパーツは同じなので、その部分は1箇所にまとめておきたい」という場面があります。
そういう場面で有用なのが「部分テンプレート」です。例えば、「scaffold」で生成されたテンプレートでは次のような使われ方をしています。
<%= render 'form' %>
この「render」メソッドは引数に渡した「form」から同じディレクトリにある「_form.html.erb」(または「_form.html.slim」)を探し出し、レンダリングした結果を呼び出した場所に当てはめます。
また次のような呼び出し方の「locals」オプションでキーを名前、値を初期値にしたローカル変数を設定することもできます。
<%= render partial: 'form', locals: { book: @book } %>
この場合、部分テンプレート名も「partial」オプションとして指定する必要があります。
もちろん、部分テンプレートの中から呼び出し元のテンプレートに渡されたインスタンス変数を参照することもできますが、このようにローカル変数として明示的に渡して参照する方が、部分テンプレートと呼び出し元のテンプレートの関連を疎結合に保てるので、より好ましいです。
変更する範囲を小さくとどめておく努力を
ビューはアプリケーションのインターフェースをつかさどる部分であり、多くの画面で共通のデザインを持たせるために冗長になりがちです。修正が必要になったときのために、変更する範囲を小さくとどめておく努力が日常的に求められます。
そこで、Slimや今回紹介できなかった「simple_form」といった便利な技術を積極的に使ってみてください。きっと開発が楽になることでしょう。
- Railsアプリの設計をMVCごとに見直しリファクタリングして連載総まとめ
- 「設定より規約」のRailsで必要なセッティングの基礎知識と国際化/多言語対応
- ActionMailerのSMTP設定、テンプレートで送信&ActiveModelの基本的な使い方とバリデーション
- RailsテストフレームワークRSpecのインストールと基本的な使い方、基礎文法
- RailsのテンプレートエンジンSlimの書き方とActionViewのヘルパーメソッド、レイアウトの使い方
- Rails開発を面白くするアクションコントローラーの5大機能とルーティングの基本
- ActiveRecordにおけるモデルの「関連」とコールバックの使い方
- ActiveRecordの基本機能とマイグレーション、バリデーション
- 現場で使えるか見極めたいRails 4.1の新機能8選
- 特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法
- scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する
- 簡単インストールから始める初心者のためのRuby on Railsチュートリアル
著者プロフィール
林 慶(Rails技術者認定シルバー試験問題作成者)
平成2年大阪生まれ。2006年から高専で情報工学を学んでいたが当時は所謂プログラミングができない工学生だった。卒業後、高専の専攻科に上がったもののマンネリ化したキャンパスライフに飽きたため休学して渡豪。そこでプログラミングに対するコンプレックスを克服するためにRuby on Railsなどでアプリケーションを作ることを覚える。
帰国後から現在までは復学し推薦システムに関する研究を行いながら、アジャイルウェアでRuby on Railsアプリケーションの開発業務に従事している。
好きなメソッドはinject。
監修者プロフィール
山根 剛司(Ruby業務開発歴7年)
兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。
2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。
2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。
Ruby関西所属。好きなメソッドはtap。
Twitter:@spring_kuma、Facebook:山根 剛司
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Railsで目指せ、情熱エンジニア(9):Railsのコントローラをテストする
前回はインテグレーションテストとしてCucumberでテストを作成しました。今回はユニットテストとして、RSpecを使ってコントローラのテストを作成します - Railsで目指せ、情熱エンジニア(10):コントローラとモデルをリファクタリングする
前回用意したRailsアプリのコントローラのテスト(スペック)をもとに、今回はコントローラとモデルのリファクタリングの実例を紹介します。 - 3rdRailによるRailsプログラミング入門(5):RailsアプリにおけるControllerの位置付け
今回からControllerクラスの開発ステップを紹介する。Controllerクラスの役割とは何だろうか - 資格試験は転職に役立つか:Rails技術認定試験がスタート、合格者に聞いた
- @IT自分戦略研究所 資格辞典:Rails技術者認定試験(Rails 3 Certified Programmer)