#エラーの状況
簡易版twitterアプリを作成して、rails sで仮装サーバーを立ち上げ、localhost:3000にアクセルした時にでたエラーです。今まで遭遇したことがなかったエラーでしたので解決策について記述します。
#エラー内容に対する仮説
エラー画面には「localhostでリダイレクトが繰り返し行われました」という記述があります。本来であればlocalhost:3000にアクセスすると、route.rbではtweetsコントローラーのindexアクションが実行されビューが表示されるはずです。
Rails.application.routes.draw do
root 'tweets#index'
devise_for :users
resources :tweets do
resources :comments, only: :create
end
resources :users, only: :show
end
しかし今回の場合、本来はビューファイル(index.html.erb)を表示したいのに、読み込む段階でリダイレクトされてしまってるためのエラーとなっています。
ですのでコントローラーの表記によって起きているエラーと推測します。
#修正内容
では早速コントローラーの記述を確認します。
未ログインユーザーがindexにアクセスしようとするとmove_to_indexが実行され,indexアクションにリダイレクトされます。
class TweetsController < ApplicationController
before_action :move_to_index
def index
@tweets = Tweet.includes(:user).order('created_at DESC').page(params[:page]).per(2)
end
(省略)
def move_to_index
redirect_to action: :index unless user_signed_in?
end
end
ここで問題となるのが、リダイレクト前にmove_to_indexが呼ばれるため無限ループが起きてしまします。この問題によって今回のエラーは発生していました。
#解決策
indexアクションにアクセスした時、indexアクションへのリダイレクトを繰り返すことにより無限ループが起こるので以下のように修正することでエラーを解決することができました。
###before
before_action :move_to_index
###after
before_action :move_to_index,except: :index