LoginSignup
10
8

More than 5 years have passed since last update.

Railsで特定フィールドのみバリデーションしたい

Last updated at Posted at 2016-11-23

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)
10
8
0

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
10
8