はじめに
※基本的なMVCの考え方や使い方はこの記事には記載していません。
Railsで用いられているMVCモデルの考え方。始めてRailsに触れたときは本当に理解に苦しめられました。
今でこそ、なんとなく使い方がわかってきて、コントローラーで各アクションを定義してその対応するビューを作ってあげてみたいにやってますけど、なんとなくなんです。なんとなくじゃダメだ!って思いまして。。。
今回から3回にわたってM(モデル)、V(ビュー)、C(コントローラー)それぞれの仕組みを深掘りしていきたいと思います。
今回はビューを掘り下げていきます!よろしくお願いします。
Action View
HTMLなどのレスポンスをブラウザに表示するビューの機能はAction Viewという仕組みによって実現されています。ビューファイルで使うerbの拡張子を持つファイルはAction Viewの仕組みに含まれているERBを利用しています。
##ControllerとViewの関係
Railsアプリケーションでは、app/viewsディレクトリの中にコントローラー名と同じ名前のディレクトリが作成されることによって、コントローラーとその対応するビューが関連づけられています。そしてビューファイルがブラウザへ返されるまでに、その対応したビューファイルにレイアウトや部分テンプレートも組み合わさって表示されます。ビューファイルがそのままブラウザに返されているわけではなく、Action Viewによってまとめられてから返されているのです。
controllerとviewの関係といえば、コントローラーで定義したインスタンス変数が対応したviewの中でも使用できますよね。これは、ただ単純にコントローラーに定義したから対応したビューで使えるといったことではなく、Railsの中で定義されている複数のメソッドたちを通して、読み替えられ、Action Viewに渡されています。そしてもう一度ビューファイルのインスタンス変数としてセットされて、使えているという仕組みです。
感覚的にcontrollerで定義したからviewでインスタンス変数が使えていますし、その表現が間違っているわけでもないですが、Railsに搭載されている様々なメソッドによってcontrollerで定義したものがviewで使えるんだということは頭の片隅に置いとくべきですね。
本当の意味で仕組みを理解するためにはRails自体を構築しているソースコードを読み解く必要があるようですが。。。
ヘルパーメソッド
ビューファイルの中でよく使うlink_toやform_withらはヘルパーメソッドと言い、あらかじめ定義されている処理です。
ヘルパーメソッドは自分で作ることもできます。
ERBタグを使ってRubyの記述をビューファイルに書くことはできますが、一連の処理をビューファイルに書くよりも、ヘルパーメソッドを自分で作ってまとめた方がすっきりとしたコードに見えます。
ヘルパーメソッドを作成するためにはHelperというモジュールを使います。
モジュール
Rubyのクラスみたいなものです。しかしモジュールはインスタンスを生成できません。
下記のように定義します。
module モジュール名
end
モジュールの中にクラスを定義することも可能です。
module Sample
class Test
end
end
上記の例でTestクラスを呼び出す。↓
Sample::Test
インスタンスを生成したいときはクラスを使い、処理だけが必要な時にモジュールを使うという認識でOKです。
モジュールの中にクラスを定義することで、もし上記の例でTestクラスが複数あったら、下記のように区別ができます。
module Sample1
class Test
end
end
module Sample2
class Test
end
end
Sample1::Test
Sample2::Test
Helper
ヘルパーメソッドを作るためのモジュールです。
app/helperの配下に用意されています。application_helper.rbや各コントローラーに対応したhelperファイルに処理を定義することでヘルパーメソッドとして使えます。
module ApplicationHelper
def sample
# sampleというヘルパーメソッドです
end
end
1行目に注目してください。実際には◯○Helperと定義されています。
また、上記のようにヘルパーメソッドを定義したら下記のようにビューファイルで使用できます。
<%= sample %>
ビューファイルにRubyの処理を長々と書いたり、同じ処理を繰り返し使う場合はヘルパーメソッドとして切り出した方が好ましいです。
最後に
自分で書いときながら、オリジナルアプリでビューファイルにガッツリRubyの処理を書いていて、反省です。モジュールについて学んだことは完全にスコーンと頭から抜けていたのでいい振り返りになりました。今回のことを実際に活かしていけるようにしていきたいですね。