Ruby on Railsチュートリアルを一通り終えた程度の初心者です。
「パスワード」の変更画面を作ってます。
パスワードはUserモデルの一部、
パスワード変更画面は他の項目(都道府県とかのプロフィール項目)を変更する画面とは別です。
そのため、
・User(プロフィール)変更時はバリデーションしたくない
・ユーザー登録時とパスワード変更時のときだけバリデーションしたい
ということになります。
つまり状況によってバリデーションを変えたいのです。
こういった場合、通常どのようにするのが一般的でしょうか?
↓に同じ状況での対処方法がありましたが、2013年と古い記事でしたので
今は違う方法が一般的でしたら教えていただけると幸いです。
Railsで「このタイミングだけこのバリデーションしたい」っていうとき
※以下から補足追加
パスワードの登録は、チュートリアルを真似して
以下のようにしてます。
Userモデル
ruby
1class User < ApplicationRecord 2 3has_secure_password 4 validates :password, 5 presence: true, 6 allow_nil: true, 7 length: { in: 8..30 } 8 9 10 validates :password_digest, 11 presence: true, 12 length: { maximum: 100 } 13end 14
Userコントローラ
ruby
1class UsersController < LoginController 2 before_action :logged_in_user, only: [:edit, :update] 3 before_action :correct_user, only: [:edit, :update] 4 5 def edit 6 @user = User.find(params[:id]) 7 end 8 9 def update 10 @user = User.find(params[:id]) 11 if @user.update_attributes(user_params) 12 flash[:success] = "更新しました" 13 redirect_to @user 14 else 15 render 'edit' 16 end 17 end 18 19 20 21 private 22 23 def user_params 24 params.require(:user).permit(:name, :email, :password, :password_confirmation) 25 end 26 27 28end 29
パスワード変更コントローラ
ruby
1class PasswordEditsController < LoginController 2 before_action :logged_in_user, only: [:edit, :update] 3 before_action :correct_user, only: [:edit, :update] 4 5 def edit 6 @user = User.find(params[:id]) 7 end 8 9 def update 10 @user = User.find(params[:id]) 11 if @user.update_attributes(user_params) 12 flash[:success] = "更新しました" 13 redirect_to edit_password_edit_path 14 else 15 render 'edit' 16 end 17 end 18 19 20 21 private 22 23 def user_params 24 params.require(:user).permit(:password, :password_confirmation) 25 end 26 27end 28