1
1

【Rails】yieldとrenderの違い

Last updated at Posted at 2023-12-26

はじめに

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メソッドを使う)

application.html.erb
<!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はパーシャルをレンダリングするために使う。

個々のページの図1,2が分かりやすいです

参考文献

メソッド呼び出し(super・ブロック付き・yield - Ruby 3.2 リファレンスマニュアル)
レイアウトとレンダリング - Railsガイド
yieldについて|Ruby on Railsの基礎を学ぼう! - Techpit
【Rails入門】yieldとcontent_forを使ってページ毎にタイトルを変更
yield -Railsドキュメント
render - Railsドキュメント
Railsのviewとlayoutの評価順についてコードを読んで納得した
【Rails】View(ビュー)の構成ファイルを読み解く

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1