バックエンドにrails (apiモード)、フロントエンドにreatを用いたアプリケーションを作成しています。
railsでapplication_controller内にメソッドを記述しコントローラーないで使用しているのですが、user_controllerでは定義したメソッドが使えない状況です。
具体的にはfollowing_trainingでapplication_controllerで定義したcurrent_userを使用していますが、以下の画像の通り、エラーが出ます。原因はcurrent_userからの戻り値がnilであるためです。
user_controller意外のコントローラーでcurrent_userを使用するとnilではなくログイン中のUserオブジェクトが返ってきますので、current_userの記述にもん
https://gyazo.com/58b48ed586371d89385afa91de3f2417
コードは以下です。
application_controller
class
1 include ActionController::Cookies 2 3 def login! 4 session[:user_id] = @user.id 5 end 6 7 def current_user 8 @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] 9 end 10 11 def logged_in? 12 !current_user.nil? 13 end 14 15 def logged_in_user 16 render json: { logged_in: false, message: current_user } unless logged_in? 17 end 18 19 def correct_user 20 @user = User.find_by(id: params[:id]) 21 render status: 404 unless User.find_by(id: session[:user_id]) == @user 22 end 23 24 def admin_user 25 render json: { status: 500, message: '現在のユーザーはadminユーザーではありません。' } unless current_user.admin 26 end 27end
user_controller (following_trainingでapplication_controllerで定義したcurrent_userを使用しています)
class UsersController < ApplicationController before_action :logged_in_user, only: %i[index update] before_action :correct_user, only: [:update] before_action :admin_user, only: [:destroy] def index @user = User.all render json: @user end def show @user = User.find(params[:id]) render json: @user.followingTs end def create @user = User.create(registrations_params) render json: @user end def update @user = User.find(params[:id]) @user.update(registrations_params) render json: @user end def destroy @user = User.find(params[:id]) if @user.destroy render json: { status: 200, message: 'ユーザー削除成功' } else render json: { status: 404, message: 'ユーザー削除失敗' } end end def follow_training @training = Training.find(params[:training_id]) @owner =User.find(@training.user_id) if (@owner.id != @current_user.id) && (@training.limit_number > @training.followers.length) current_user.follow(@training) else render json: { status: '500', message: '参加人数上限に達しています' } end end def unfollow_training @user = User.find(params[:user_id]) @training = Training.find(params[:training_id]) @user.unfollow(@training) end def followed_training? @user = User.find(params[:user_id]) @training = Training.find(params[:training_id]) if @user.following?(@training) render json: { followed: true } else render json: { followed: false } end end private def registrations_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end end
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/21 01:53 編集
2021/03/21 03:00
2021/03/23 12:17