Ruby on Rails で特定のフィールドのみバリデーションしたかったのですが、なかなかやりかたが見つからず、やっとできたので、メモ
私が使用している Rails のバージョンは、5です。
情報元
【Rails】一部のフィールドのみvalidを実行する – @masuidrive blog
にて、一応やり方が書いてあるものの、情報が古く、また使い方がそれだけだと分からなかったので、時間がかかりましたが、勉強になりました。 Rails 使い始めて2ヶ月の身にはなかなか大変でした。
やり方
1. moduleを作成
Rails/app/models/concerns以下に、下記の内容のファイルを保存(例として、valid_columns.rbという名前で保存)
valid_columns.rb
class ActiveRecord::Errors
# 指定したカラムのエラーを削除
def delete(column)
@errors.delete(column.to_s)
end
end
module ActiveRecord::Validations
# 指定したカラムのみをvalid?
def valid_columns?(*columns)
valid?
cols = columns.flatten.collect(&:to_s)
errors.keys.each do |k|
errors.delete(k) unless cols.include?(k.to_s)
end
errors.empty?
end
end
2. 使いたいモデルで読み込み
例として、userモデルなら
user.rb
require 'valid_columns' #上記のファイル名と合わせる必要
# (以下、略)
3. 使う
※すでに WEBrick (組み込みサーバー)が起動している場合には、再起動しないと読み込んでくれないかも
例として、userモデルで、passwordフィールドだけバリデートしたい場合には、
なんかのコントローラとか.rb
@user.new
@user.valid_columns?(:password)
例として、userモデルで、nameフィールドとpasswordフィールドだけバリデートしたい場合には、
なんかのコントローラとか.rb
@user.new
@user.valid_columns?(:name, :password)