前提・実現したいこと
session[:user_id]を利用したい。
フロントサイドにReact.js、サーバーサイドにrails APIを利用してwebアプリ(アプリ名: Thinky)を開発しています。(deviseを使用していない。)
発生している問題・エラーメッセージ
ユーザーログイン(サインアップ)時にセットしたsession[:user_id]が利用できる時と利用できない時がある。
具体的には、サインアップ・ログイン・ログアウト・ログイン状態保持のメソッド(logged_in)では、では利用できる。
上記以外のメソッドでは利用できない。
該当のソースコード
application_controller.rb
ruby
1class ApplicationController < ActionController::API 2 include ActionController::Cookies 3 include CurrentUserConcern 4end
application.rb
ruby
1require_relative 'boot' 2 3require "rails" 4 5require "active_model/railtie" 6require "active_job/railtie" 7require "active_record/railtie" 8require "active_storage/engine" 9require "action_controller/railtie" 10require "action_mailer/railtie" 11require "action_view/railtie" 12require "action_cable/engine" 13require "rails/test_unit/railtie" 14 15 16Bundler.require(*Rails.groups) 17 18module Thinky 19 class Application < Rails::Application 20 config.load_defaults 5.2 21 22 config.middleware.use ActionDispatch::Cookies 23 config.middleware.use ActionDispatch::Session::CookieStore 24 25 config.api_only = false 26 config.middleware.insert_before 0, Rack::Cors do 27 allow do 28 origins 'http://localhost:3000' 29 resource '*', 30 :headers => :any, 31 :methods => [:get, :post, :patch, :delete, :options], 32 credentials: true 33 end 34 end 35 end 36end
routes.rb
ruby
1Rails.application.routes.draw do 2 3 get 'whies/index' 4 5 resources :sessions, only: [:create] 6 resources :registrations, only: [:create, :edit, :update] 7 delete :logout, to: "sessions#logout" 8 get :logged_in, to: "sessions#logged_in" 9 10 resources :whies do 11 member do 12 get 'count' 13 get 'user' 14 post '/like/:why_id' => 'likes#like', as: 'like' 15 delete '/like/:why_id' => 'likes#unlike', as: 'unlike' 16 get '/status/:why_id' => 'likes#status' 17 get 'search' 18 get 'like_whies' 19 end 20 end 21 22 post 'whies/post' 23 patch 'whies/update' 24 25 get 'answers/find_pv/:id' => 'answers#find_pv' 26 get 'answers/find_pb/:id' => 'answers#find_pb' 27 get 'answers/index_pv' 28 get 'answers/index_pb' 29 post 'answers/post_pv' 30 post 'answers/post_pb' 31end
current_user_concern.rb
ruby
1module CurrentUserConcern 2 extend ActiveSupport::Concern 3 4 included do 5 before_action :set_current_user 6 end 7 8 def set_current_user 9 if session[:user_id] 10 @current_user = User.find(session[:user_id]) 11 end 12 end 13end 14
session[:user_id]を利用できる
registration_controller.rb
ruby
1class RegistrationsController < ApplicationController 2 3 def create 4 user = User.create!( 5 email: params['user']['email'], 6 password: params['user']['password'], 7 password_confirmation: params['user']['password_confirmation'] 8 ) 9 10 if user 11 session[:user_id] = user.id 12 render json: { 13 status: :created, 14 user: user, 15 } 16 else 17 render json: { status: 500 } 18 end 19 end 20 21 def edit 22 @user = User.find(params[:id]) 23 render json: @user 24 end 25 26 def update 27 @user = User.find(params[:id]) 28 29 30 if params['user']['password'] 31 32 user = @user.update( 33 email: params['user']['email'], 34 username: params['user']['username'], 35 password: params['user']['password'], 36 ) 37 else 38 user = @user.update( 39 email: params['user']['email'], 40 username: params['user']['username'], 41 ) 42 end 43 44 if user 45 render json: { 46 status: :created, 47 user: @user 48 } 49 else 50 render json: { status: 500 } 51 end 52 end 53end 54
sessions_controller.rb
ruby
1class SessionsController < ApplicationController 2 include CurrentUserConcern 3 4 def create 5 user = User 6 .find_by(email: params["user"]["email"]) 7 .try(:authenticate, params["user"]["password"]) 8 if user 9 session[:user_id] = user.id 10 render json: { 11 status: :created, 12 logged_in: true, 13 user: user, 14 } 15 else 16 render json: { status: 401 } 17 end 18 end 19 20 def logged_in 21 if @current_user 22 render json: { 23 logged_in: true, 24 current_user: @current_user, 25 session: session 26 } 27 else 28 render json: { 29 logged_in: false 30 } 31 end 32 end 33 34 def logout 35 reset_session 36 render json: { status: 200, logged_out: true } 37 end 38end 39 40
session[:user_id]を利用できない(@current_userがNo Class)
whies_controller
ruby
1class WhiesController < ApplicationController 2 include CurrentUserConcern 3 4 def index 5 @whies = Why.where(share: true) 6 7 render json: @whies 8 9 end 10 11 def show 12 @why = Why.find(params[:id]) 13 render json: @why 14 end 15 16 def post 17 @why = Why.create(question: params[:why], genre_id: params[:genre], share: params[:share], user_id: @current_user.id) 18 render json: @why 19 end 20 21 (以下省略)
likes_controller.rb
ruby
1class LikesController < ApplicationController 2 include CurrentUserConcern 3 before_action :set_variables 4 5 6 (省略) 7 8 def status 9 like = Like.find_by(why_id: @why.id, user_id: @user.id) 10 if like 11 render json: {status: "already liked"} 12 else 13 render json: {status: "not liked yet"} 14 end 15 end 16 17 private 18 def set_variables 19 @why = Why.find(params[:why_id]) 20 @user = User.find(@current_user.id) 21 end 22end
試したこと
modelの記述は、validationとassociationのみの記載となっています。
・該当のメソッドをsessions_controller.rbに移動させてルーティングを整えても、変化はありませんでした。
・concern.rbの中の記述を直接controller内に移しても変化ありませんでした。
・利用できる、利用できない、両方のメソッド内のjsonオブジェクトにsessionをレンダーさせてみましたが、利用できる方のレスポンスにはsession_idと共にuser_idの値もきちんと入っていましたが、利用できない方は、session_idしかレスポンスとして返ってきませんでした。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.5p114
BUNDLED WITH
1.17.2
rails (5.2.4.2)
rack-cors (1.1.1)
mysql2 (0.5.3)
node 13-alpine
"axios": "^0.19.2"
あなたの回答
tips
プレビュー