概要
Railsアプリにて、ログイン機能を実装するためにgem 'devise'
を利用。
users/sign_upからユーザーの新規登録を行ったところエラーが発生した。
エラー文
ArgumentError in Users::RegistrationsController#create
wrong number of arguments (given 0, expected 1)
app/controllers/users/registrations_controller.rb:13:in `create'
def create
@user = User.new(user_params)
if @user.save
redirect_to @user, notice: 'User was successfully created.'
else
render :new
end
wrong number of arguments (given 0, expected 1)
は
引数が1つ渡されるはずなのに0になってますよ。ということでコントローラーでcreateアクションがうまくできていない。
結論
has_secure_password
password_digest
を使っていたから。
devise
導入時はhas_secure_password
password_digest
を使ったセキュアパスワード設定は行わない。
代わりにencrypt_password
をテーブルカラムに追加することでセキュアパスワード設定ができる。
今回の解決までの流れ
参考:http://ja.voidcc.com/question/p-zenkcgoo-cv.html
調べるとhas_secure_password
がいらないという情報があったので、userモデルから消しました。
すると、同じようにユーザーの新規登録をすると異なるエラーメッセージが出ました。
password_digest
についてエラーが出ている模様。
ActiveRecord::NotNullViolation in Users::RegistrationsController#create
PG::NotNullViolation: ERROR: null value in column "password_digest" violates not-null
constraint DETAIL: Failing row contains (5, test, test@a.com, test@a.com, null, null,
2020-01-21 01:37:23.23543, 2020-01-21 01:37:23.23543,
$2a$11$mFFmw7JD8nrrm3hbz/LUQeFwRPYjjBNKIRAjVuRBNXUM57v2JeeI6, null, null, null).
: INSERT INTO "users" ("name", "email", "profile", "created_at", "updated_at",
"encrypted_password") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"
password_digest
はdevise
導入前にセキュアパスワード設定のために用意していたカラムです。
調べてみるとdevise
を使用するときはdevise
がpassword_digest
の代わりにencrypt_password
を作ってくれるので、password_digest`はいらないことがわかりました。
確かにdevise
の導入を行っている際にコマンド
$ rails generate devise user
を実行し、作られるマイグレーションファイルにencrypt_password
が入っていました。
class AddDeviseToUsers < ActiveRecord::Migration[5.2]
def self.up
change_table :users do |t|
## Database authenticatable
t.string :encrypted_password, null: false, default: ""
(省略)
end
今回はこのままマイグレーション実行していたのですが、既にusersテーブルにpassword_digest
カラムがあったため上書きされず、encrypted_password
は反映されてませんでした。
encrypted_password
について調べずにマイグレーション実行していたことを反省・・・
ということで、password_digest
カラムを削除してから、マイグレーションをやり直してエラーは解決しました。
もう一度結論ですが、devise
を利用してパスワードをハッシュ化し、セキュアパスワード設定をするにはカラムにpassword_digest
ではなくencrypt_password
を使うことになります。
他にもusers/newでcreateされるユーザーはdevise
管理化の
controllers/users/registrations_controller.rbのnewやcreateメソッドに従って挙動するので、
controllers/users/users_controller.rbのnewやcreateメソッドは不要になるなど
devise
を実装することで不要になるものはいくつかあります。