ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

Railsのrenderのlayout: nilとlayout: falseの違いについて

TL;DR

renderのlayout: nilとlayout: falseは違う。ここのコード内コメントがわかりやすい。
ざっくりまとめると、layoutを表示したくなかったらfalseにすべきで、nilは少し癖はあるが使い方によっては便利らしい、ということだった。
layout: nilとするとnilっぽい挙動には一切にならないことには注意が必要。

はじめに

静的ファイルをrenderする際に、

render file: Rails.root.join('public', '404.html'), status: :not_found, layout: false

などとしていることが多いと思います。なんとなく、layout: nilのほうが直観的な気がして、変えてみると動作は変わりませんでした。
しかし、よく調べてみると微妙に挙動が違うらしいことがわかったため、まとめます。

Docを眺めてみる

layout (ActionView::Layouts::ClassMethods) - APIdock

false: There is no layout
nil: Force default layout behavior with inheritance

とありますが、なんのことだかわかりません。悲しい。

実装を眺めてみる

実装はここにある。

when false
  nil

とある。falseなら描画されないっぽいことがわかる。

when nil
  name_clause

nilについては、何かはしているが何もわからない。かなり早い段階で詰まり、ここnameはどこにあるのだろうという気持ちになった。

実装中にコメントを発見する

ここのコード内コメントにそのものが書いてあった。

layout: nilの場合は、controllerの継承チェーンを登って、layoutを探していくっぽい?
時間を見つけてちゃんとサンプルアプリ作ってみたいですが、全くnilっぽくない挙動だなとは思いました。

おわりに

layout: nilとlayout: falseは、ぜんぜん違うものな上に、命名と挙動が食い違っている感もあるので注意が必要ですね。
自分がlayout: nilを使うことはなかなかないだろうなあと思います。
一方で、layout: nilを使ったうまい実装例があれば、一度読んでみたいです。