【Rails】<%= yield %>とは
Ruby on Railsを復習していく中で、新しくアプリケーションを作成した際にデフォルトで記述されている<%= yield %>の役割について、今までは気しなかったのですが、こういうところから深堀してみようかということで調べてみました。
<%= yield %>メソッド
このメソッドはRuby on Railsのビューで使用される非常に重要なメソッドで、アプリケーションのレイアウトとビューを組み合わせるためのものとなります。
<%= yield %>を使うことで、共通のレイアウト内に特定のビューをレンダリングすることができます。これにより、ページのヘッダーやフッターなど、すべてのページで共通の部分を一元管理することができます。
app/views/layouts/application.html.erbというファイルがデフォルトのレイアウトとして使用されます。このファイル内で<%= yield %>を使用すると、その位置に各ビューの内容が挿入されます。
使用例
下記のような記述のあるindexファイルがあるとします。
<h1>Welcome to my website!</h1>
<p>This is the homepage.</p>
そしてapplication.html.erbファイルには次のようなコードが含まれているとします。
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<%= yield %>
</body>
</html>
この場合、<%= yield %>の位置にwelcome/index.html.erbの内容が挿入され、最終的なHTMLは次のようになります
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<h1>Welcome to my website!</h1>
<p>This is the homepage.</p>
</body>
</html>
<%= yield %>は、Railsアプリケーションで共通のレイアウトを使用しつつ、各ビューで異なる内容を表示するための強力なツールです。
yieldには引数を渡すことも可能
yieldには引数を渡すことも可能で、特定の名前を持つコンテンツを挿入することもできます。
content_forメソッドを使うと、特定の名前を持つコンテンツブロックを定義し、それを後からyieldで呼び出すことができます。
content_forメソッドとは
content_forメソッドは、Ruby on Railsのビューで使用され、特定の名前を持つコンテンツブロックを定義するためのものです。このメソッドは、ビューの特定の部分を動的にカスタマイズするために使用されます。
使用例
下記のコードでは、:headerという名前のコンテンツブロックを定義しています。このコンテンツブロックは、後からyieldメソッドを使って呼び出すことができます。
<% content_for :header do %>
<h1>これはヘッダーです</h1>
<% end %>
下記のレイアウトでは、<%= yield :header %>の位置に:headerという名前のコンテンツブロックが挿入されます。
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<%= yield :header %>
<%= yield %>
</body>
</html>
その結果、最終的なHTMLは次のようになります。
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<h1>これはヘッダーです</h1>
<!-- ここには他のビューの内容が挿入されます -->
</body>
</html>
content_forメソッドを使うと、ビューの特定の部分を動的にカスタマイズすることが可能になります。これは、ページごとに異なるスタイルシートやスクリプトを読み込むなど、より細かいカスタマイズを行いたい場合に使えるメソッドになります。
感想
Ruby on Railsで新しいアプリケーションを作成すると、デフォルトのレイアウトファイルapp/views/layouts/application.html.erbが自動的に生成され、その中に<%= yield %>が記述されています。今まではデフォルトであるということもあり、レイアウトに必要という程度の理解でしかなかったですが、実際にこの記述がどのような仕組みになっているのかというのふと考え今回復習に至りました。今までの学習では表面的なところばかりで深堀が足りていませんでしたが、時間を見つけて少しずつ見直していこうと思います。
Discussion