#はじめに
ユーザー管理機能(ログイン/ログアウト)を実装したあとに、ユーザー編集機能を実装しました。バリデーションで少してこずったので、書き記します。
開発環境
ruby 2.6.6
rails 6.0.0
#目次
1.ルーティング
2.コントローラー
3.モデル
#1.ルーティング
編集機能実装にあたり、「edit」及び「update」アクションをルーティングとして追加する。
resources :users, only: [:edit, :update]
#2.コントローラー
ターミナルでuserコントローラーを作成する。想定として、一度ユーザーの「nickname」、「email」、「パスワード」を新規登録しており、後から「nickname」と「email」を編集できるようにする。
rails g controller users
作成したコントローラーに下記記述を追記する。deviseはインストール済みなので、「current_user」メソッドが使用できる。userテーブルには「nickname」と「email」がカラムとして既に存在している。
def edit
end
def update
if current_user.update(user_params)
redirect_to root_path
else
render :edit
end
end
private
def user_params
params.require(:user).permit(:nickname, :email)
end
#3.モデル
パスワードに関するバリデーションに「on: :create」を追加する。このオプションによりパスワードに関するバリデーションは新規登録のみ適用される。ちなみにこのcreateオプションを追加しないと、「nickname」、「email」を正しく更新できない。(パスワードの入力がないためバリデーションで拒否される)
with_options presence: true do
---------------中略-----------------
PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze
# 半角アルファベット(大文字・小文字・数値)
validates :password, format: { with: PASSWORD_REGEX, message: 'はアルファベットと数字を含めてください' }, length: { minimum: 6 }, on: :create
end
以上