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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails

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

Q&A

解決済

2回答

1062閲覧

user_controllerでapplication_controllerで定義したメソッドを使えない

gozikyu

総合スコア4

Ruby on Rails

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

0グッド

0クリップ

投稿2021/03/20 02:02

バックエンドに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

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

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

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

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

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

guest

回答2

0

ベストアンサー

RAILSのsessionはdefaultではクッキーを使っています。
APIでのアクセスでは意識的にでないとクッキーは送られないので、その関係でしょう
Rails の API モードでセッションやクッキーを使えるようにする
とかあります

投稿2021/03/20 03:27

winterboum

総合スコア23401

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

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

gozikyu

2021/03/21 01:53 編集

アドバイス誠にありがとうございます。 確認したところ、すでにconfig/application.rbでは以下の通りセッションを有効にする設定をしておりました。 user_controller以外のコントローラではセッションを使用できていますので、こちらの設定は有効になっていると考えています。 config.middleware.use ActionDispatch::Cookies config.middleware.use ActionDispatch::Session::CookieStore config.middleware.use ActionDispatch::ContentSecurityPolicy::Middleware
winterboum

2021/03/21 03:00

となると、、、 1. 他のcontrollerと比べ before_action に違いは? 2. UsersController の全てのactionで?
gozikyu

2021/03/23 12:17

色々と試したところ、解決しました。 アドバイスいただきありがとうございました! 結果だけでいうとpostリクエストをgetリクエストに変更するとなぜかうまくいきました。 理由としておそらくですが、postリクエストなのにパラメータを何も渡していなかったのでそれがよくなかったのかな?と思っています。 不完全燃焼な感はありますが、、
guest

0

検証の中で、application_controllerないのメソッドが使えないのではなく、ログインユーザー内容を保持するsessionパラメータが使えてないことがわかりました。

sessionを用いないメソッドを定義したところ、問題なくuser_controllerないで使用できました。

なぜ、sessionが使えないのか というところを調査しています。
ご知見ありましたら助言いただけると幸いです。

よろしくお願いいたします。

投稿2021/03/20 02:12

gozikyu

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問