質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

492閲覧

Session[user_id]を利用できない

SomaSekimoto

総合スコア9

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/05/08 14:46

編集2020/05/10 02:49

前提・実現したいこと

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"

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問