###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
は実行されないということらしい。
今後、注意していきたいものです。