アプリケーションを作っていく際、すでにテーブルに保存してあるデータを更新したい場面があるかと思います。
例えば、登録した商品の情報をアップデートする際。購入が行われるたびに購入個数を1ずつカウントしていきたい場合は都度テーブルのデータをアップデートする必要があります。
rails g modelで作成したモデルであれば問題なくアップデートできるのですがdeviseを利用して作成したモデルについてはアップデートの際にパスワードの入力が必要となります。
今回は、そんなdeviseを使ったモデルのアップデート方法をご紹介します!
また、「半角英数字のみ」などパスワードのバリデーションを残したままアップデートできる方法もご紹介します!
パスワードを入力せずにカラムを更新できるようにする
まずは、パスワードを入力せずにカラムをアップデートできるようにしましょう。
大まかな手順は以下の通りです。
手順
- コントローラーの編集
- ルーティングの編集
- モデルファイルの編集
コントローラーを編集する
rails g devise:controllers モデル名
で作成したregistrations_controller.rbファイルの先頭と53行目あたりの以下部分を編集します。
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_account_update_params, only: [:update]
〜 中略 〜
# If you have extra params to permit, append them to the sanitizer.
↓以下の部分がコメントアウトされているのでコメントアウトを解除しましょう。
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys:[:変更したいカラム名])
end
end
この記述により、ストロングパラメーターの設定ができました。
新規登録の際にも設定したやつです!
アップデートの際も同様で、既にdeviseに存在する ’email’ と ‘password’ 以外のカラムを操作する場合はストロングパラメーターの設定が必要になります。
ルーティングを修正する
ルーティングを以下のように編集しましょう。
devise_for :users, controllers: {
registrations: "users/registrations"
}
この記述により、先ほど編集したregistrations_controller.rbファイルへのルーティングができました。
モデルファイルを編集する
次に、モデルファイルを編集しましょう。
ここに、パスワードなしでもアップデートできるようなコードを記述します。
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
↓以下を記述
def update_without_current_password(params, *options)
params.delete(:current_password)
if params[:password].blank? && params[:password_confirmation].blank?
params.delete(:password)
params.delete(:password_confirmation)
end
result = update_attributes(params, *options)
clean_up_passwords
result
end
end
上記のメソッドを読み込むために、再度registrations_controller.rbファイルを編集しましょう。
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_account_update_params, only: [:update]
〜 中略 〜
↓追記しましょう
def update_resource(resource, params)
resource.update_without_password(params)
end
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys:[:変更したいカラム名])
end
end
以上で完成です!!
これで、パスワードなしでユーザー情報をアップデートできるようになりました!
バリデーションを残したままアップデートする
パスワードに対して、追加でバリデーションを設定していない場合は上記の処理でアップデートができるようになります。
しかし、「半角英数字のみ保存を許す」などバリデーションを設定している場合はそのバリデーションが働き正常にアップデートが完了されません。
バリデーションを設定している場合、以下の追加処理を行いましょう。
# (例)半角英数字のみの保存を許すバリデーションを設定している
validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d][a-zA-Z0-9]+\z/, message: "は半角英数字で入力してください" }, on: :registration ←on以下を追加する。
上記の記述は、registrationの場合のみ、つまり新規登録の場合のみバリデーションを適用するという記述です。
これによって、アップデートの際にはバリデーションが適用されず、変更したいカラムをアップデートできるようになりました!
アウトプット系の投稿を執筆するスピードもだいぶ早くなってきました。
いつかは自分自身で見つけたお役立ち情報を発信できるように学習を進めていきたいです!
コメント