プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

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などで試してみたけど無理だった)