LoginSignup
8
9

More than 3 years have passed since last update.

rails usersテーブルの値をpasswordなしで更新する

Posted at

はじめに

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 >を指定すればよいらしい。
ちなみに参考資料はこちら

もっと勉強しないとなぁ〜

8
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9