こんばんは、お久しぶりです。
ダメですね、ブログとか日記とか、どうしても続けられない症候群なジョンさんです…
フリーランスですしちゃんとアウトプットする習慣をつけようと思ったので、
少しずつでも書いていければと思っています。
読みにくいかもしれませんが、お手柔らかにお願い致します。
挨拶が長くなりましたが、本日の本題
今、私は独自サービスの開発を頑張っています。
内容は後日別記事にアップするとして、行き詰まった内容について備忘録
環境
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_code
も password
も渡せてるはず。
なんだろう…
問題のコードはこちら
/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を知り、
使ってみたさに導入したのですが、まだまだ知識不足だなと痛感しました。
反省点
・エラー文をまずしっかり読もう