@yosaku_ibs

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Rails】<%= yield %>の動きについて

Q&A

Closed

解決したいこと

下記ソースコード内の一番下から2段目にある<%= yield %>について質問がございます。
この<%= yield %>はどのような動きをしているのでしょうか?

※yieldとは->「ブロックを引数にとるメソッドのようなもの」と認識しております。

ソースコード

# app/views/layouts/application.html.erb

<body>
    <div class = "container">
        <% if flash[:notice] %>
        <div class = "alert alert-success" role = "alert" >
        <%=flash[:notice]%>
    </div>
    <%end%>

    <% if flash[:alert] %>
        <div class = "alert alert-danger" role= "alert">
        <%=flash[:alert]%>
    </div>
    <%end%>
    <%=yield%>
</div>

自分で試したこと

思いつく限りの単語を入力して検索しましたが
解決に繋がるヒントにたどり着けませんでした...。

以上、お手数ではございますが
もしご存知の方がいらっしゃいましたら
ご教示の程よろしくお願い申し上げます。

0 likes

1Answer

レイアウトの中に <%= yield %> と書くと、コントローラが render した内容がそこに埋め込まれます。「Rails yield」で検索すれば解説ページが出てきますが、まずは Rails ガイドを読むといいでしょう。

Ruby の本来の yield は、 yield を含むメソッドに与えられたブロックを実行する構文です。説明は「Ruby yield」で検索すれば出てきます。

Rails はレイアウトの内部処理をうまくブロックつきメソッドの形で実装し、レイアウトの中で yield が使えるように便宜を図ってくれています。

1Like

Comments

  1. @yosaku_ibs

    Questioner

    @uasi様

    いつも大変お世話になっております。
    ご回答くださり誠にありがとうございます。

    回答文の冒頭の「レイアウトの中に <%= yield %> と書くと〜」という文章の中で「renderした内容がそこに埋め込まれます」とあります。

    しかし私自身の手でrenderをした覚えがございません...。

    どういう行動がrenderに繋がるのかご教示頂けますでしょうか?

    以上、お手数おかけし申し訳ございませんが
    ご教示よろしくお願い致します。
  2. render は指示しなければ規約に従って暗黙的に行われます。たとえば、

    class ProductsController < ApplicationController
    def index
    @products = Product.all
    end
    end

    が定義されているとします。この index アクションが実行されると、テンプレート app/views/products/index.html.erb が render され、レイアウト app/views/layouts/application.html.erb に埋め込まれ、レスポンスとして返されます。

    これは、アクションについて「render の指示がなければ app/views/(コントローラ名前半)/(アクション名).html.erb を render する」という規約があるからです。

    指示する場合は

    def index
    render plain: 'This is response body'
    end

    などと書けます。

    詳しくはレイアウトとレンダリングのガイドを読んでください。 https://railsguides.jp/layouts_and_rendering.html
  3. @yosaku_ibs

    Questioner

    @uasi様

    いつも大変お世話になっております。
    非常にわかりやすくご説明くださり誠にありがとうございます。

    頭の中に霧がかかって混沌としていましたが
    一気に霧が晴れました。
    これからレイアウトとレンダリングのガイドを読もうと思います。

    いつもありがとうございます。

    以上、御礼申し上げます。

Your answer might help someone💌