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を使ったうまい実装例があれば、一度読んでみたいです。