スポンサーリンク

【Ruby on Rails】localhostからリダイレクト。これぞ無限ループ!

みなさんこんにちは!
のむ(@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」にしてあげることで無限ループ地獄空脱出することができたのです。。笑

自分でもエラーのオチがあまりにも意外すぎて、思わず笑ってしまいました。笑

これは、同じチームの方が発見してくれたおかげで気づくことができました。
一人で考えて、悩むことも大事ですが、時には周を頼る強さも大事ということですよね〜〜〜〜

というのが今回の記事のオチです!笑

最後に

以上が、無限ループに陥った原因の記事になります。

最後に今回の記事ついてまとめて終わりたいと思います!

・リダイレクト
・・・意図したページにユーザーを遷移させる処理のこと

・無限ループ
・・・リダイレクトの範囲が全てのページにかかってしまい、延々とリダイレクトされ続ける現象のこと

・エラーが出た時はスペルミスがないかの確認を丁寧に行うこと

・時には、仲間を頼る強さも必要になるということ

同じように、無限ループで困っている人のためになる記事になればいいなと思います!

ありがとうございました!

スポンサーリンク




この記事を書いた人