Sorceryを使ったログイン機能実装時のエラー②
1、まずマイグレーションから見直す
schema.rb
ActiveRecord::Schema.define(version: 2020_10_11_033753) do create_table "users", force: :cascade do |t| t.string "email", null: false t.string "crypted_password" t.string "salt" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "first_name", null: false t.string "last_name", null: false t.index ["email"], name: "index_users_on_email", unique: true end end
・特におかしな点は見当たらず。
いったんbundle exec rails db:rollback
でマイグレーションへの変更をなかったことにし、もう一度bundle exec rails db:migrate
・エラー発生・・・エラー解消どころか増やしてしまった。
SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "users" ADD "first_name" varchar NOT NULL
・ググったところ、カラム追加とnull:falseによるnull制約を同時に行おうとしたことが原因と判明。
add_column :users, :first_name, :string, null:false add_column :users, :last_name, :string, null: false
上のコードのnull:falseを削除してやってみる →無事動作!
・null:falseを別のマイグレーションファイルで反映させ、何とか振り出しに。
2、ユーザー登録がそもそもできていない可能性を考えてみる
・userコントローラーのcreateアクションにdebuggerを挟んでみる。
(byebug) params <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"Mwo1tjCDGqdVSvxtnTTeyHknytDilXHGIFNz9x6KRyT3TaIzCgr47D3wsYL9n26AZn wIu9YMZRK7uWBZJMIEsQ==", "user"=><ActionController::Parameters {"first_name"=>"naka", "last_name"=>"yama", "email"=>"nakayama@gmail.com", "password"=>"123456", "password_confirmation"=>"123456"} permitted: false>, "commit"=>"登録", "controller"=>"users" , "action"=>"create"} permitted: false> (byebug) @user #<User id: nil, email: "nakayama@gmail.com", crypted_password: nil, salt: nil, created_at: nil, updated_at: nil, first_name: "naka", last_name: "yama"> (byebug) params.require(:user) <ActionController::Parameters {"first_name"=>"naka", "last_name"=>"yama", "email"=>"nakayama@gmail.com", "password"=>"123456", "password_confirmation"=>"123456"} permitted: false> (byebug) params.require(:user).permit(:last_name, :first_name, :email, :password, :password_confirmation) <ActionController::Parameters {"last_name"=>"yama, "first_name"=>"naka", "email"=>"nakayama@gmail.com", "password"=>"123456", "password_confirmation"=>"123456"} permitted: true>
・どうやらしっかりと登録はできているらしい。Rails consoleでUser.allをするとしっかり帰ってくる。やっぱり問題はloginページみたい。
・ふと思い立ってlogin_formの下記のコードからscope: :sessionの表記を消してみる。
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>
を
<%= form_with(url: login_path, local: true) do |f| %>
に変更。
今度はしっかり動いた!!
・本来は、scope: :session
を記述しないとsessionにパラメータを渡せないので必須のはず。
おそらく、sorceryを使用していることによりscope: :session
コードがあると挙動がおかしくなるのかも。
(ちなみにscope: :user_session
,scope: :user_sessions
などで試してみたけど無理だった)