はじめに
Railsチュートリアルを進めているとview/layouts/application.html.erbの中で見かけたyieldというメソッドと部分的に描画するrenderという似たようなメソッドが目につき、これどういう違いなのかと疑問に思ったので記事にしてました。
そもそもapplication.html.erbって?
Railsのビューは
- application.html.erb → HTMLやHEADタグなどの共通レイアウト
- アクション名.html.erb → BODYタグ内の個別レイアウト
この二つで役割分担して画面表示している。
application.erbはコントローラ固有のレイアウトが見つからない場合、デフォルトで使用される共通レイアウト。
全てのページで使われるhead、ヘッダー、フッターなどをここで一括して書くことで個別レイアウト内で同じコードを書く必要がなくなり、DRYが保たれる。
(コントローラーでレイアウトを指定するにはlayoutメソッドを使う)
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
yield
yield
は共通プログラムと個別プログラムで分割してコーディングするために使用するRubyのメソッド。
共通レイアウト(application.html.erb)のbodyタグ内にある yield
の部分に、コントローラーで処理された (アクション名).html.erbの個別レイアウトが埋め込まれる。
render
view内ではパーシャル(部分テンプレート、個別テンプレート)に対して用いられる。
<%= render "form" %>
レンダリングされるビュー内に置かれている上のコードは、その場所で_form.html.erbという名前のファイルをレンダリングする。
(パーシャルファイル名の冒頭にはアンダースコア(_)が付いていることに注意)
主な使われ方はheader、footerやformなどの使いまわし。
これらはサイトでページが異なっても一貫した描画が行われることが多いのでrenderメソッドで部分テンプレートを使いまわす。
yieldの部分renderで書ける?
書けるが、柔軟性が失われる。
renderでの指定するファイル名はアンダースコア始まりなのに対し、アクションで指定するビューファイルのファイル名はアクション名に一致する必要がある。
さらにrenderの引数もアクションのページ指定ごとに動的に変える必要も出てくるので難しい。
なのでここでrenderを使うのではなくコントローラーで処理されたものを指定なしに埋め込むyieldを使った方がスマート。
まとめ
ビュー内での使われ方として
- yieldはレンダリングされているビューファイルを共通レイアウトの中に埋め込むのに使う。
- renderはパーシャルをレンダリングするために使う。
参考文献
メソッド呼び出し(super・ブロック付き・yield - Ruby 3.2 リファレンスマニュアル)
レイアウトとレンダリング - Railsガイド
yieldについて|Ruby on Railsの基礎を学ぼう! - Techpit
【Rails入門】yieldとcontent_forを使ってページ毎にタイトルを変更
yield -Railsドキュメント
render - Railsドキュメント
Railsのviewとlayoutの評価順についてコードを読んで納得した
【Rails】View(ビュー)の構成ファイルを読み解く