みなさんこんにちは!
のむ(@nomu_engineer)です!
今回の記事では、僕が実際に体験した、あるあるの無限ループエラーについてまとめました。
localhostのリダイレクトによる無限ループです。
この記事を読むメリット
・無限ループの仕組みが理解できる
・意外なことで無限ループになるということがわかる
この記事を読むおすすめの読者
・プログラミング初心者
・駆け出しエンジニア
・無限ループにに陥ってる人
それでは早速本題に入っていきたいと思います!
そもそも無限ループとは
まずは無限ループについて少しだけ説明させていただきます。
無限ループとはリダイレクトによって、延々と同じページにリダイレクトされ続けることで、発生します。
つまり、同じページに飛ばされ続けるということです。
無限ループが起きるよくある原因の一つが、ログインしていないユーザーをトップページに遷移するようにリダイレクト処理を行うが、トップページでも同じようにリダイレクト処理が行われ、延々とトップページにリダイレクトされ続けるというものです。
そのことを筆者は知っていたのになぜ起きたのか。。
それを説明していきます。
なぜ無限ループが起きたのか
僕自身、無限ループの存在は知っていたので、無限ループにならないための処理を記述しているつもりでした。
ですが、少しのミスで、そして、プログラミング初心者の僕にとっては、気付きにくいミスで、無限ループは起こってしまいました。
まずは、コードを見てもらったほうが早いので、こちらのコードを見てください。
こちらは、作成中のアプリのcontrollerの画像です。

少し見にくいかもしれませんが、注目していただきたいのは、以下の行です。
2行目の
before_action :move_to_index, expect: [:index, :show]
27行目から31行目の
def move_to_index
unless user_signed_in?
redirect_to action: :index
end
end
この処理は、ログインしていないユーザーがURLから直接、商品投稿画面などに、アクセスできないように、リダイレクト処理を書いているものです。
リダイレクト処理とは、意図したページにユーザーを遷移させる処理のことです。
今回のコードの場合は、ログインしていないユーザーはトップページにリダイレクトするように処理を書いていました。
リダイレクトの処理が27行目から31行目の記述になります。
トップページにリダイレクトされたユーザーが、トップページで、トップページにリダイレクトされないようにするための記述が、2行目の記述です。
これは、リダイレクトの対象の範囲からトップページを外さないと、延々とトップページからトップページにリダイレクトされ続けるため、それを防ぐために2行目の記述があります。
しかし、無限ループを起こらないように記述しているのに、なぜか無限ループが発生したのです。
お気づきの方は、もう気付いているかもしれませんね。
そうです、スペルミスです。笑
2行目の、indexとshowのページをリダレクトのスコープから外すために、「except」を用いるのですが、「except」が「expect」になっていました。。。笑
この「expect」を「except」にしてあげることで無限ループ地獄空脱出することができたのです。。笑
自分でもエラーのオチがあまりにも意外すぎて、思わず笑ってしまいました。笑
これは、同じチームの方が発見してくれたおかげで気づくことができました。
一人で考えて、悩むことも大事ですが、時には周を頼る強さも大事ということですよね〜〜〜〜
というのが今回の記事のオチです!笑
最後に
以上が、無限ループに陥った原因の記事になります。
最後に今回の記事ついてまとめて終わりたいと思います!
・リダイレクト
・・・意図したページにユーザーを遷移させる処理のこと
・無限ループ
・・・リダイレクトの範囲が全てのページにかかってしまい、延々とリダイレクトされ続ける現象のこと
・エラーが出た時はスペルミスがないかの確認を丁寧に行うこと
・時には、仲間を頼る強さも必要になるということ
同じように、無限ループで困っている人のためになる記事になればいいなと思います!
ありがとうございました!