##やりたいこと
現在バックエンドをrails -apiモード、フロントはreactでポートフォリオ を作成中です。
ログイン後に、再度ログインを保持する(current_userを確認する)機能を作成したいと思ってます。
(お手数ですが、以下sessions_contorller.rbのコード参照)
しかし、logged_in?のメソッドを実行した時に、@current_userがフロントに返されず、毎回elseの処理となってしまいます。
@current_userをフロントに返したくどのようにすればいいかお教えいただけると嬉しいです。
##試したこと
railsチュートリアルのの8章を参考に再度記述し直し・
binding.pry
で以下のことを確認
application_controller.rb
のメソッドは問題ない様子
create
メソッドのlogin @user
の後に binding.pry
を置いてみたところ
def create login @user binding.pry ←ここに記載 render json: { logged_in: true, user: @user }
session[user_id]がName Errorとなってしまう。
(sessionと記述するとuser_idが入っていることは確認できた)
# [9] pry(#<Api::V1::SessionsController>)> session{user_id} # => {:user_id=>1} # [10] pry(#<Api::V1::SessionsController>)> session[user_id] # NameError: undefined local variable or method `user_id' for #<Api::V1::SessionsController:0x00000000022c18> # Did you mean? @user # from (pry):15:in `create'
sessions_contorller.rb
module Api module V1 class SessionsController < ApplicationController before_action :current_user, only: [:logged_in?] #loginでurl飛んできた後に実行するメソッド def create @user = User.find_by(email: session_params[:email]) if @user && @user.authenticate(session_params[:password]) login @user render json: { logged_in: true, user: @user } else render json: { status: 401, errors: ['正しいメールアドレス・パスワードを入力して下さい' ] ,user: @user ,session:session{user_id}} end end #logged_inでurl飛んできた後に実行するメソッド def logged_in? if @current_user render json: { logged_in: true, user: @current_user } else render json: { logged_in: false, errors: 'ユーザーが存在しません,ログインし直して下さい' } end end private def session_params params.require(:user).permit(:email, :password) end end end end
Application_controller.rb
class ApplicationController < ActionController::API include ActionController::Helpers before_action :fake_load skip_before_action :verify_authenticity_token, raise: false # Railsが認証トークンを使用しないように helper_method :login, :current_user def login(user) session[:user_id] = user.id end def current_user if session[:user_id] # @current_user ||= User.find(id: session[:user_id]) @current_user ||= User.find(session[:user_id]) end end end
routes.rb
Rails.application.routes.draw do namespace :api do namespace :v1 do root 'static_pages#home' post '/signup', to: 'users#create' post '/login',to:'sessions#create' get '/logged_in', to: 'sessions#logged_in?' delete '/logout',to:'sessions#logout' resources :users resources :recipes end end end
お手数ですが、どうすればsession[user_id]を取り出して@current_userにログイン中のuserを格納し、フロントへ返せるか教えていただけると幸いです。
##参考にしたサイト
https://railsguides.jp/action_controller_overview.html#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3
##環境
・ローカル環境
・ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
・Rails 6.1.3.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。