前提・実現したいこと
Ruby on Railsでローカル環境で学習しているのですが
どのページにアクセスしてもログインページにリダイレクトしてしまいます。
Macを使っています。
原因お分かりになる方、ぜひご教授いただきたいです。
学習は本を見て進めています。
参考書は
Ruby on Rails 5 速習実践ガイドのチャプター4の最後でこの原因に気付きました。
https://book.mynavi.jp/supportsite/detail/9784839962227.html
以上、よろしくお願いいたします。
発生している問題・エラーメッセージ
「http://localhost:3000/」にアクセスしようとすると強制的に
「http://localhost:3000/login」になります。
他にも「http://localhost:3000/admin/users」や「http://localhost:3000/tasks」なども
「http://localhost:3000/login」にリダイレクトしてします。
該当のソースコード
config/routes.rb
Rails.application.routes.draw do get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' namespace :admin do resources :users end root to: 'tasks#index' resources :tasks end
controllers/admin/users_controller.rb
ruby
1class Admin::UsersController < ApplicationController 2 before_action :require_admin 3 before_action :set_user, only: [:show, :edit, :update, :destroy] 4 5 def index 6 @users = User.all 7 end 8 9 def show 10 end 11 12 def new 13 @user = User.new 14 end 15 16 def edit 17 end 18 19 def create 20 @user = User.new(user_params) 21 22 if @user.save 23 redirect_to admin_user_path(@user), notice: "ユーザ「#{@user.name}」を登録しました。" 24 else 25 render :new 26 end 27 end 28 29 def update 30 if @user.update(user_params) 31 redirect_to admin_user_path(@user), notice: "ユーザ「#{@user.name}」を更新しました。" 32 else 33 render :new 34 end 35 end 36 37 def destroy 38 @user.destroy 39 redirect_to admin_users_url, notice: "ユーザ「#{@user.name}」を削除しました。" 40 end 41 42 private 43 44 def user_params 45 params.require(:user).permit(:name, :email, :admin, :password, :password_confirmation) 46 end 47 48 def set_user 49 @user = User.find(params[:id]) 50 end 51 52 def require_admin 53 redirect_to root_path unless current_user.admin? 54 end 55end 56
Application_controller.rb
ruby
1class ApplicationController < ActionController::Base 2 helper_method :current_user 3 4 private 5 6 def current_user 7 @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] 8 end 9 10 def login_required 11 redirect_to login_path unless current_user 12 end 13end 14
sessions_controller.rb
ruby
1class SessionsController < ApplicationController 2 skip_before_action :login_required 3 4 def new 5 end 6 7 def create 8 user = User.find_by(email: session_params[:email]) 9 10 if user&.authenticate(session_params[:password]) 11 session[:user_id] = user.id 12 redirect_to root_path, notice: 'ログインしました。' 13 else 14 render :new 15 end 16 end 17 18 def destroy 19 reset_session 20 redirect_to root_path, notice: 'ログアウトしました。' 21 end 22 23 private 24 25 def session_params 26 params.require(:session).permit(:email, :password) 27 end 28end 29
tasks_controller.rb
class TasksController < ApplicationController before_action :set_task, only: [:show, :edit, :update, :destroy] def index @tasks = current_user.tasks.recent end def show end def new @task = Task.new end def edit end def create @task = current_user.tasks.new(task_params) if @task.save redirect_to @task, notice: "タスク「#{@task.name}」を登録しました。" else render :new end end def update @task.update!(task_params) redirect_to tasks_url, notice: "タスク「#{@task.name}」を更新しました。" end def destroy @task.destroy redirect_to tasks_url, notice: "タスク「#{@task.name}」を削除しました。" end private def task_params params.require(:task).permit(:name, :description) end def set_task @task = current_user.tasks.find(params[:id]) end end
試したこと
require_adminが原因かなと思い、それを削除して試したり、アクションを消しては試してを繰り返しましたが原因が掴めずにいます。
回答1件
あなたの回答
tips
プレビュー