renderやredirect toを複数用いるときの注意点
if home.nil?
render :action => "new"
else
render layout: 'new/mobile/default_no_footer'
end
としてしまうと
An AbstractController::DoubleRenderError occurred in
と怒られてしまいます、なのでここで使用するのがand return
if home.nil?
render :action => "new" and return
else
render layout: 'new/mobile/default_no_footer' and return
end
もちろんreturnでも大丈夫です。
if home.nil?
render :action => "new"
return
else
render layout: 'new/mobile/default_no_footer'
return
end
renderを複数使用する際の注意点として、renderを複数回呼び出すとエラーになるため、条件分岐した後「and return」で明示的に終了させる。renderに関するレファレンスにも書いてあります。
慣れてきたりすると、行数を使いたくないので
render :action => "index" and return unless if @user.nil?
のようにスマートに書いたりします。
ここまではエラーが出てからでもなんとなくわかるのですが。。。
一瞬???てなったときがあったのでメモしておきます。
self.render_404 and return if @hogehoge.blank?
@client = Client.find_by_id(params[:client_id])
render layout: 'new/mobile/default_no_footer' if @user
みたいに書き、ロジックが走るとエラーが出ます。
An AbstractController::DoubleRenderError occurred in ・・・・・・
あれ?これを防ぐためにand returnを書いたのになと思ったのですが出てるもんは仕方ないのでとりあえず前にifを出して普通に書いてみたら・・・エラーが出ないで直った。
なんでかわからなかったので調べてみたらありました!!
and returnを使用できるとき
エラーが出ている文をよくみてみると、要するにrenderの戻り値がたまたま true なのを利用して、 and で受けて次の文を書いているだけっぽいです。なので万が一 false や nil を返してきたら return は実行されないということらしい。
今後、注意していきたいものです。