質問: Ruby on Rails 5 アプリケーションプログラムの中の記述でわからない箇所があります。 ``` def list_tag(collection, prop) content_tag(:ul) do collection.each do |element| concat content_tag(:li, element.attributes[prop]) end end end ``` という記述があります。 ビューヘルパー、コレクションにはオブジェクトの配列、プロップにはオブジェクトのプロパティ名。 各オブジェクトの同一プロパティをリスト形式で出力するビューヘルパーです。 ここで疑問なのが、each内でconcatを使用しli要素を出力しているのはわかるのですが、なぜul要素にはconcatが必要ないのでしょうか。ご教授ください。 (初学者なので、ご考慮していただけるとたすかります。Railsのバージョンが古い部分については承知しています)
回答: このメソッドは以下の呼び出し構成になっていると思います。 ``` list_tag -> content_tag -> content_tagの引数のブロック ``` `list_tag` は文字列を返す必要があります。 `list_tag` 中で文字列を返すメソッド呼び出しは `content_tag` 一つだけです。なので、`concat` は必要ありません。 逆に、`content_tag`の引数のブロックは、ループにより複数回数のメソッド呼び出しがあるため、ループ毎の結果の文字列を結合する必要があります。このため、`concat` で文字列を結合する必要があります。 `concat` はインスタンス変数の内部バッファ(`output_buffer`)に文字列を結合します。 `content_tag` は引数ブロックで変更された `output_buffer` を結合した状態で、自身の返り値にします。