学習サービス「progate」の「Ruby on Rails」のレッスンが完成し、そのコードをダウンロードして、AWSのサービス「cloud9」にアップロードして起動を試しておりました。
起動は上手くいき、tweet_appの画面を表示させることができました。
しかし、ユーザーの登録ボタンを押したり、ログインボタンを押したあと、投稿一覧画面にリダイレクトされず、ログイン画面が再び表示されてしまいます。
確認したところ、UsersControllerのcreateアクションやloginアクションでsessionにuser_idを保存しており、確かにここでは保存できているのですが、リダイレクトしたあとのApplicationControllerのset_current_userアクションにおいて、session[:user_id]がnilになっていておかしい挙動になっているようです。
ApplicationControllerのset_current_userアクションにおいて、session[:user_id]が取れるようになり、正しくリダイレクトできるように何かご教授いただけることがあれば幸いです。
- UsersController (createアクションまたはloginアクション実行時)
Ruby
1class UsersController < ApplicationController 2 before_action :authenticate_user, {only: [:index, :show, :edit, :update]} 3 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} 4 before_action :ensure_correct_user, {only: [:edit, :update]} 5 6 def index 7 @users = User.all 8 end 9 10 def show 11 @user = User.find_by(id: params[:id]) 12 end 13 14 def new 15 @user = User.new 16 end 17 18 def create 19 @user = User.new( 20 name: params[:name], 21 email: params[:email], 22 image_name: "default_user.jpg", 23 password: params[:password] 24 ) 25 if @user.save 26 #ここでsessionに保存してリダイレクト 27 session[:user_id] = @user.id 28 flash[:notice] = "ユーザー登録が完了しました" 29 redirect_to("/users/#{@user.id}") 30 else 31 render("users/new") 32 end 33 end 34 35 def edit 36 @user = User.find_by(id: params[:id]) 37 end 38 39 def update 40 @user = User.find_by(id: params[:id]) 41 @user.name = params[:name] 42 @user.email = params[:email] 43 44 if params[:image] 45 @user.image_name = "#{@user.id}.jpg" 46 image = params[:image] 47 File.binwrite("public/user_images/#{@user.image_name}", image.read) 48 end 49 50 if @user.save 51 flash[:notice] = "ユーザー情報を編集しました" 52 redirect_to("/users/#{@user.id}") 53 else 54 render("users/edit") 55 end 56 end 57 58 def login_form 59 end 60 61 def login 62 # メールアドレスのみを用いて、ユーザーを取得するように書き換えてください 63 @user = User.find_by(email: params[:email]) 64 # if文の条件を&&とauthenticateメソッドを用いて書き換えてください 65 if @user && @user.authenticate(params[:password]) 66 #ここでsessionに保存してリダイレクト 67 session[:user_id] = @user.id 68 flash[:notice] = "ログインしました" 69 redirect_to("/posts/index") 70 else 71 @error_message = "メールアドレスまたはパスワードが間違っています" 72 @email = params[:email] 73 @password = params[:password] 74 render("users/login_form") 75 end 76 end 77 78 def logout 79 session[:user_id] = nil 80 flash[:notice] = "ログアウトしました" 81 redirect_to("/login") 82 end 83 84 def likes 85 @user = User.find_by(id: params[:id]) 86 @likes = Like.where(user_id: @user.id) 87 end 88 89 def ensure_correct_user 90 if @current_user.id != params[:id].to_i 91 flash[:notice] = "権限がありません" 92 redirect_to("/posts/index") 93 end 94 end 95 96end 97
- ApplicationController
Ruby
1class ApplicationController < ActionController::Base 2 before_action :set_current_user 3 4 def set_current_user 5 #ここでsession[:user_id]がnilになる 6 puts session[:user_id] 7 @current_user = User.find_by(id: session[:user_id]) 8 end 9 10 def authenticate_user 11 if @current_user == nil 12 flash[:notice] = "ログインが必要です" 13 redirect_to("/login") 14 end 15 end 16 17 def forbid_login_user 18 if @current_user 19 flash[:notice] = "すでにログインしています" 20 redirect_to("/posts/index") 21 end 22 end 23 24end 25
cloud9のRailsのバージョン:Rails 5.0.3
何か補足などが必要でしたら対応いたします。
大変お手数ですが、よろしくお願いいたします。
あなたの回答
tips
プレビュー