🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1419閲覧

current_userがnilになる

divclass123

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/12/27 23:52

このアプリのgithun

ユーザー機構はrails tutorialをパクってます

前提・実現したいこと

正しいログイン情報を入力しても
ログインページに戻される。

問題はcurrent_userがnilになっていて、before_action logged_in_userメソッドの中にある、logged_in?メソッドの中の !current_user.nil?
によって、正しいログイン情報を入力してもログインページにリダイレクトされます。

current_userが機能しません

発生している問題・エラーメッセージ

登録しようとしてるメールアドレスが本人かどうか。
という、メールによるアカウント有効化を実装してたら、急にcurrent_userがnilになりました。

該当のソースコード

sessionsController

1 def create 2 # auth = request.env['omniauth.auth'] 3 # #binding.pry 4 # if auth.present? 5 # user = User.find_or_create_from_auth(request.env['omniauth.auth']) 6 # session[:user_id] = user.id 7 # redirect_back_or user 8 # else 9 user = User.find_by(email: params[:session][:email].downcase) 10 # 受け取ったemailからfind_byでデータベースに 11 # 問い合わせてユーザー取得 12 if user && user.authenticate(params[:session][:password]) 13 if user.activated? 14 log_in user 15 # まずそのユーザーがいるかnilガード 16 # いたらpasswordとauthenticateかける 17 18 params[:session][:remember_me] == '1' ? remember(user) : forget(user) 19 # check boxがonの時は1になるので1の時は 20 # ? 以降がtrueの処理 21 # : 以降がfalseの処理 22 redirect_back_or user 23 # redirect_back_or メソッド呼び出し 24 # 引数にuser_url(user)を渡す 25 else 26 message = "Emailによるアカウントの有効化がされてません. " 27 message += "Emailに有効化のリンクがあるか確認してください" 28 flash[:warning] = message 29 redirect_to root_url 30 31 end 32 else 33 flash.now[:danger] = 'invalid email/password combination' 34 render 'new' 35 end

sessions_helper

# 現在ログインしているユーザーの情報を取得 def current_user # DBの問い合わせの数を可能な限り小さくしたい # logged_in?メソッドでも使われてるし、、、 if user_id = session[:user_id] # セッションがある場合 # すなわちログインしてる時のみ # sessionにアクセスした結果を変数に # 入れておいてあとで使いまわした方が # 早くなる @current_user ||= User.find_by(id: user_id) # find_byでデータベースにクエリを投げる # ブラウザのセッションにあるuser_idをもとにUser定義 # find_byの実行結果をインスタンス変数に保存する # ことで、1リクエスト内におけるデータベースへの # 問い合わせは最初の一回だけになり、 # 以後の呼び出しではインスタンス変数の結果を # 再利用する # すでに@current_userが存在する場合って何? # 一回current_userを実行したら、 # @current_userがあるのでそれを使ってね # sessionのuser_idがあるということは # 既にログインしてるといてDBにユーザーの情報があるはず。 # だからsessionのuser_idをDBでfind_byかければいい elsif (user_id = cookies.signed[:user_id]) # sessionが張られてなかったらcookiesにあるかも user = User.find_by(id: user_id) if user && user.authenticated?(:remember,cookies[:remember_token]) # nilガード # クッキーのuser_idとremember_tokenが一致してる log_in user @current_user = user end end end def logged_in? !current_user.nil? # nilじゃなかったら # すなわちログインしてたらfalseが # 返ってくるけど、それだとif文とか # 使う時にややこしいので、! # で返り値の真偽値を逆にして # trueを返すようにしてる end

問題はcurrent_userがnilになっていて、before_action logged_in_userメソッドの中にある、logged_in?メソッドの中の !current_user.nil?
によって、正しいログイン情報を入力してもログインページにリダイレクトされます。

user_controller

include SessionsHelper before_action :set_user, only: [:show,:edit,:update,:correct_user] before_action :logged_in_user, only: [:index,:edit,:update,:following,:followers] before_action :correct_user, only: [:edit, :update] def create @user = User.new(user_params) if @user.save @user.send_activation_email flash[:info] = "メールをチェックしてアカウントを有効化してください." redirect_to root_url else render 'new' end end

application_controller

class ApplicationController < ActionController::Base include SessionsHelper def logged_in_user unless logged_in? store_location # ユーザーがいきたがってたページを記憶 flash[:danger] = "Please log in" redirect_to login_url end end end
Started GET "/users/new" for ::1 at 2020-12-28 08:38:49 +0900 (0.3ms) SET NAMES utf8mb4, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 Processing by UsersController#new as HTML Rendering users/new.html.erb within layouts/application Rendered shared/_error_messages.html.erb (Duration: 1.0ms | Allocations: 197) Rendered shared/_form.html.erb (Duration: 8.4ms | Allocations: 1699) Rendered users/new.html.erb within layouts/application (Duration: 9.9ms | Allocations: 1998) [Webpacker] Everything's up-to-date. Nothing to do Rendered shared/_header.html.erb (Duration: 5.6ms | Allocations: 606) Completed 200 OK in 141ms (Views: 115.3ms | ActiveRecord: 0.0ms | Allocations: 33366) Started POST "/users" for ::1 at 2020-12-28 08:39:03 +0900 Processing by UsersController#create as HTML Parameters: {"authenticity_token"=>"6BpcReZQaebi4KgLtoDPPEE6jeMGVcK9OyK1WkGfb1zmx5DyPmQUbBSUZUjzudP9I9a4B5tjnPgq2URJjO8maw==", "user"=>{"nickname"=>"セイレーン", "email"=>"harasou412soccer@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"会員登録"} (0.2ms) BEGIN ↳ app/controllers/users_controller.rb:17:in `create' User Exists? (0.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'harasou412soccer@gmail.com' LIMIT 1 ↳ app/controllers/users_controller.rb:17:in `create' User Create (0.3ms) INSERT INTO `users` (`nickname`, `email`, `created_at`, `updated_at`, `password_digest`, `activation_digest`) VALUES ('セイレーン', 'harasou412soccer@gmail.com', '2020-12-27 23:39:04.149438', '2020-12-27 23:39:04.149438', '$2a$12$ax.Z34PLUxLYuYOm.fpMU.vrlfouJoFvGYR6zy8cZL0rXA5oavV7u', '$2a$12$FVe9k121MJMmCjyEY7.iJex4DRz9gSTVDgHdFWA/EAoES.qJEnEMK') ↳ app/controllers/users_controller.rb:17:in `create' (2.1ms) COMMIT ↳ app/controllers/users_controller.rb:17:in `create' Rendering user_mailer/account_activation.html.erb within layouts/mailer Rendered user_mailer/account_activation.html.erb within layouts/mailer (Duration: 1.9ms | Allocations: 205) Rendering user_mailer/account_activation.text.erb within layouts/mailer Rendered user_mailer/account_activation.text.erb within layouts/mailer (Duration: 0.9ms | Allocations: 172) UserMailer#account_activation: processed outbound mail in 9.5ms Delivered mail 5fe91b1871a7d_13d63ff60ddcc1784534@SoichironoMBP.mail (4641.7ms) Date: Mon, 28 Dec 2020 08:39:04 +0900 From: noreply@example.com To: harasou412soccer@gmail.com Message-ID: <5fe91b1871a7d_13d63ff60ddcc1784534@SoichironoMBP.mail> Subject: =?UTF-8?Q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88=E3=81=AE=E6=9C=89=E5=8A=B9=E5=8C=96/Account?= =?UTF-8?Q?_activation?= Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_5fe91b1870980_13d63ff60ddcc1784436"; charset=UTF-8 Content-Transfer-Encoding: 7bit ----==_mimepart_5fe91b1870980_13d63ff60ddcc1784436 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 IOOCiOOBhuOBk+OBne+8gSDjgrvjgqTjg6zjg7zjg7Pmp5gNCg0K5Lul5LiL 44GuVVJM44KS44Kv44Oq44OD44Kv44GX44Gm44CB44GC44KJ44KG44KL44Kz 44O844OS44O844Gu5LiW55WM44KS6KaX44GE44Gm44G/44G+44GX44KH44GG 77yBDQoNCkhlcmUsT25seSB5b3VyIENvZmZlZSBQYXNzcG9ydCEgIEJvbiBW b3lhZ2UhIQ0KaHR0cDovL2xvY2FsaG9zdDozMDAwL2FjY291bnRfYWN0aXZh dGlvbnMvU2ZCUHVyTzlYc3Z2Zy1RaktpQmx6QS9lZGl0P2VtYWlsPWhhcmFz b3U0MTJzb2NjZXIlNDBnbWFpbC5jb20NCg== ----==_mimepart_5fe91b1870980_13d63ff60ddcc1784436 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PCFET0NUWVBFIGh0bWw+DQo8aHRtbD4NCiAgPGhlYWQ+DQogICAgPG1ldGEg aHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7 IGNoYXJzZXQ9dXRmLTgiIC8+DQogICAgPHN0eWxlPg0KICAgICAgLyogRW1h aWwgc3R5bGVzIG5lZWQgdG8gYmUgaW5saW5lICovDQogICAgPC9zdHlsZT4N CiAgPC9oZWFkPg0KDQogIDxib2R5Pg0KICAgIDxoMT5Db2ZmZWUgUGFzc3Bv cnQ8L2gxPg0KDQo8cD7jgojjgYbjgZPjgZ3vvIEg44K744Kk44Os44O844Oz 5qeYPC9wPg0KDQo8cD4NCuS7peS4i+OBrlVSTOOCkuOCr+ODquODg+OCr+OB l+OBpuOAgeOBguOCieOChuOCi+OCs+ODvOODkuODvOOBruS4lueVjOOCkuim l+OBhOOBpuOBv+OBvuOBl+OCh+OBhu+8gQ0KPC9wPg0KDQo8YSBocmVmPSJo dHRwOi8vbG9jYWxob3N0OjMwMDAvYWNjb3VudF9hY3RpdmF0aW9ucy9TZkJQ dXJPOVhzdnZnLVFqS2lCbHpBL2VkaXQ/ZW1haWw9aGFyYXNvdTQxMnNvY2Nl ciU0MGdtYWlsLmNvbSI+44Kv44Oq44OD44Kv44GX44Gm44Ki44Kr44Km44Oz 44OI44KS5pyJ5Yq55YyW44GX44Gm44GP44Gg44GV44GE77yBL0FjdGl2YXRl ISBCb24gVm95YWdlITwvYT4NCiAgPC9ib2R5Pg0KPC9odG1sPg0K ----==_mimepart_5fe91b1870980_13d63ff60ddcc1784436-- Redirected to http://localhost:3000/ Completed 302 Found in 5173ms (ActiveRecord: 2.8ms | Allocations: 31530) Started GET "/" for ::1 at 2020-12-28 08:39:09 +0900 Processing by DrinksController#index as HTML Redirected to http://localhost:3000/login Filter chain halted as :logged_in_user rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.0ms | Allocations: 489) Started GET "/login" for ::1 at 2020-12-28 08:39:09 +0900 Processing by SessionsController#new as HTML Rendering sessions/new.html.erb within layouts/application Rendered sessions/new.html.erb within layouts/application (Duration: 0.6ms | Allocations: 316) [Webpacker] Everything's up-to-date. Nothing to do Rendered shared/_header.html.erb (Duration: 1.5ms | Allocations: 618) Completed 200 OK in 27ms (Views: 26.9ms | ActiveRecord: 0.0ms | Allocations: 18278)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

単純に架空のemailで登録してた

投稿2020/12/27 23:53

divclass123

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問