109
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

and returnを使うときの注意点

Last updated at Posted at 2015-07-01

###renderredirect 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 で受けて次の文を書いているだけっぽいです。なので万が一 falsenil を返してきたら return は実行されないということらしい。

今後、注意していきたいものです。

109
83
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
109
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?