##はじめに
Userテーブルのカラムをpasswordなしで更新しようと思ったときに、更新ができずに手間取ってしまったのでその備忘録として記載する。
##概要
usersテーブルにprofileというカラムを持たせていたのだが、ユーザー登録後にユーザーページからユーザー情報を更新したい。
##ぶつかった課題
controllerで以下のように定義して実行した際にRollbackが起こり、値が更新されなかった。
mypage_controller.rb
class MypageController < ApplicationController
# 途中略
def update
user=User.find(current_user.id)
#パスワードなしでのプロフィールの変更
user.update_without_password(nickname:params[:mypage][:nickname],profile: params[:mypage][:profile])
redirect_to root_path,notice: 'プロフィールが変更されました'
end
# 途中略
end
- エラー内容
[2] pry(#<MypageController>)> user.update_without_password(nickname:params[:mypage][:nickname],profile: params[:mypage][:profile])
(0.3ms) BEGIN
↳ (pry):2
User Exists (3.4ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'ytest@gmail.com' AND `users`.`id` != 21 LIMIT 1
↳ (pry):2
(0.2ms) ROLLBACK
↳ (pry):2
=> false
[3] pry(#<MypageController>)> user.errors
=> #<ActiveModel::Errors:0x00007f8b3304a270
@base=
#<User id: 21, email: "ytest@gmail.com", last_name: "test", first_name: "test", last_name_kana: "test", first_name_kana: "test", nickname: "test", profile_image: nil, birthday: "1990-12-04", telephone: "12345678", created_at: "2020-01-10 04:36:29", updated_at: "2020-01-10 04:36:29", provider: nil, uid: nil, profile: "test">,
@details={:password=>[{:error=>:too_short, :count=>6}, {:error=>:blank}], :password_confirmation=>[{:error=>:blank}]},
@messages={:password=>["は6文字以上で入力してください", "を入力してください"], :password_confirmation=>["を入力してください"]}>
##解決策
modelファイルのバリデーションいじった。
詳細は以下
- 変更前
user.rb
class User < ApplicationRecord
# 途中略
validates :password, length: { minimum: 6 }
validates :password_confirmation, presence: true
validates :password, presence: true, unless: :uid?
end
- 変更後
passwordのバリデーションに対して、on create を追加することで、 userの新規登録するときにのみバリデーションによる入力チェックがかかるように変更した。コード内容は以下
user.rb
class User < ApplicationRecord
# 途中略
# create のみバリーデーションをかける
validates :password, length: { minimum: 6 }, on: :create
validates :password_confirmation, presence: true, on: :create
validates :password, presence: true, unless: :uid?, on: :create
end
とりあえずバリデーションを状況によって、かけたい場合には、オプションとしてon< xxx >を指定すればよいらしい。
ちなみに参考資料はこちら
もっと勉強しないとなぁ〜