【Rails5.2 + Sorcery】ログイン実装に困ってた話

Ruby on Rails

こんばんは、お久しぶりです。
ダメですね、ブログとか日記とか、どうしても続けられない症候群なジョンさんです…
フリーランスですしちゃんとアウトプットする習慣をつけようと思ったので、
少しずつでも書いていければと思っています。

読みにくいかもしれませんが、お手柔らかにお願い致します。


挨拶が長くなりましたが、本日の本題

今、私は独自サービスの開発を頑張っています。
内容は後日別記事にアップするとして、行き詰まった内容について備忘録

スポンサーリンク

環境

Rails5.2
Sorcery

スポンサーリンク

エラーの内容

ログイン処理を実装中、以下のエラーが発生しました。

Started POST "/sign_in" for ::1 at 2019-10-18 01:52:20 +0900
Processing by UserSessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"Dzw6FvK5YWEisuY7tbOW+E/ox2a4OcPJBAyodgAzL/hSWP8vjC/HYiLlTbEOMZqmUYPyC699u7yssXHq9c+SXw==", "post"=>{"user_code"=>"jonconan", "password"=>"[FILTERED]"}, "commit"=>"次へ"}
Completed 500 Internal Server Error in 0ms (ActiveRecord: 0.0ms)

ArgumentError (at least 2 arguments required):

app/controllers/user_sessions_controller.rb:8:in `create'

Parametersを見ると、問題なく user_codepassword も渡せてるはず。
なんだろう…

問題のコードはこちら

/app/controlelrs/user_sessions_controller.rb

  def create
    post_params = params[:post]
    @user = login(    ## ← エラーはこの行で発生していました
      user_code: post_params[:user_code],
      password: post_params[:password]
    )
    if @user
      redirect_to root_path
    else
      render json: "NG"
    end
  end

メールアドレスではなく、ユーザーIDとパスワードで認証するつもりでやってたのですが、
どうしてもうまく行かない…

修正した内容

まずそもそも、 login(~~~) って、本当にこの使い方で合ってる?
ということで、 /config/initializers/sorcery.rb を確認
といっても、導入したばかりなので特に何も変更してない…というか全文コメントアウト状態……

……って、あれ?

/config/initializers/sorcery.rb

  config.user_config do |user|
    # -- core --
    # specify username attributes, for example: [:username, :email].
    # Default: `[:email]`
    #
    # user.username_attribute_names =
          : (省略)

Oh….
デフォルトは email が使われるようになっているみたいですね。
今回は user_code を使いたいので、以下に修正

/config/initializers/sorcery.rb

  config.user_config do |user|
    # -- core --
    # specify username attributes, for example: [:username, :email].
    # Default: `[:email]`
    #
    user.username_attribute_names = [:user_code]
          : (省略)

/config/initializers/ の中のファイルを更新しているので、Railsを再起動するも、解決せず。
ここでエラー文を調べることに変更するも、該当のエラーメッセージでそれっぽいものは出て来ず…

エラー文をgoogle翻訳にかける

at least 2 arguments required

少なくとも2つの引数が必要です

・・・・・?

・・・・!

/app/controlelrs/user_sessions_controller.rb

  def create
    post_params = params[:post]
    @user = login(
      post_params[:user_code],
      post_params[:password]
    )
    if @user
      redirect_to root_path
    else
      render json: "NG"
    end
  end

通りました。

原因としては、引数の要素名を指定していたこと でした。
考えてみれば、 /config/initializers/sorcery.rb でこの要素を使うよって設定してるんだから当たり前ですね。

まとめ

以前お世話になっていた案件で、 sorcery というgemを知り、
使ってみたさに導入したのですが、まだまだ知識不足だなと痛感しました。

反省点

・エラー文をまずしっかり読もう

タイトルとURLをコピーしました