k12da
@k12da (K Yoshida)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

devise ログイン後のリダイレクトができない

解決したいこと

railsのAPIモードでログイン機能を実装中です。
devise(gem)を使用して、ログインが成功した後にマイページ(user/show)へリダイレクトしたいのですが、下記のエラーが発生します。

発生している問題・エラー

以下はpostmanでJSON形式で確認した結果です。

 "status": 500,
    "error": "Internal Server Error",
    "exception": "#<ArgumentError: wrong number of arguments (given 0, expected 1)>",
    "traces": {
        "Application Trace": [
            {
                "exception_object_id": 723680,
                "id": 0,
                "trace": "app/controllers/application_controller.rb:7:in `after_sign_in_path_for'"
            },
            {
                "exception_object_id": 723680,
                "id": 1,
                "trace": "app/controllers/users/sessions_controller.rb:20:in `create'"
            }

スクリーンショット 2022-12-25 9.23.53(2).png

該当するソースコード

app/controllers/users/sessions_controller.rb
module Api
  module V1
    module Clients
      class Users::SessionsController < Devise::SessionsController
  
        before_action :authenticate_user!, only: [:show]

       def create
          user = User.find_by(email: params[:session][:email].downcase)
          if user && user.valid_password?(params[:session][:password])
            session[:user_id] = user.id
            log_in user
            user_path(after_sign_in_path_for)
            # redirect_to 'http://localhost:3000/api/v1/clients/users/1'
            # render json: { status: 'SUCSESS', message: 'ログインしました', data: user }
          else
            render json: { status: 'LOGIN ERROR', message: 'メールアドレスまたはパスワードが正しくありません', data: user  }
          end
        end
      end
    end
  end
end

config/routes.rb
Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      namespace 'clients' do
        root :to => 'home#index'
        devise_for :users, controllers: {
           :registrations => "users/registrations",
           :sessions => "users/sessions"
           }

        resources :users do
        end
      end
    end
  end
end
app/controllers/application_controller.rb
class ApplicationController < ActionController::API
    include ActionController::Cookies
    include SessionsHelper

    protected

    def after_sign_in_path_for(resource)
        user_path
    end
end

app/helpers/sessions_helper.rb
module SessionsHelper

    def log_in(user)
        session[:user_id] = user.id
    end
end
app/controllers/api/v1/clients/users_controller.rb
module Api
  module V1
    module Clients
      class UsersController < ApplicationController
          before_action :logged_in_user, only:[:edit, :update, :destroy]

        def index
        end

        def show
          @user = User.find(params[:id])
          render json: { status: 'SUCSESS', message: 'Loaded the Users', data: @user }
        end
      end
    end
  end
end

自分で試したこと

初めはsessions_controller.rbで

redirect_to user_path

としていたのですが、以下のエラーになりました。

 "status": 500,
    "error": "Internal Server Error",
    "exception": "#<NameError: undefined local variable or method `user_path' for #<Users::SessionsController:0x0000000017bd58>

デフォルトでは root_url に飛ばされると書いていたので変更しました。

下記のような記事を参考にしました。

0

1Answer

#<ArgumentError: wrong number of arguments (given 0, expected 1)>

引数として与える値が足りないって意味ですよね

user_path には user_id を渡す必要がありませんか

0Like

Comments

  1. @k12da

    Questioner

    そうですね。
    以下のuser_pathにuser_idを引数で追加しましたが、変わらないです。
    値を渡す書き方と場所が違うのでしょうか?

    def after_sign_in_path_for(resource)
    user_path(user_id)
    end
  2. user_id っていう変数ってありますか?
    エラー内容が変わってませんか

    user_id と書いたのは例なので ユーザーのidが渡せる書き方をしてみてください
  3. @k12da

    Questioner

    user_idと言う変数はなかったです...
    下記の記事を参考にしましたが、それでも変わらなかったです
    https://qiita.com/ISSO33/items/6ca358bb288e2b236f60

    ちなみにsessions_controllerでは以下のように記述しています。
    この辺が怪しい気がします。

    user_path(after_sign_in_path_for)

Your answer might help someone💌