instance method validate

Ruby on Rails 8.1.2

Since v3.0.20

Available in: v3.0.20 v3.1.12 v3.2.22.5 v4.0.13 v4.1.16 v4.2.9 v5.2.8.1 v6.0.6 v6.1.7.10 v7.0.10 v7.1.6 v7.2.3 v8.0.4 v8.1.2

Signature

validate(*args, &block)

Adds a validation method or block to the class. This is useful when overriding the validate instance method becomes too unwieldy and you’re looking for more descriptive declaration of your validations.

This can be done with a symbol pointing to a method:

class Comment
  include ActiveModel::Validations

  validate :must_be_friends

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

With a block which is passed with the current record to be validated:

class Comment
  include ActiveModel::Validations

  validate do |comment|
    comment.must_be_friends
  end

  def must_be_friends
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

Or with a block where self points to the current record to be validated:

class Comment
  include ActiveModel::Validations

  validate do
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee)
  end
end

Note that the return value of validation methods is not relevant. It’s not possible to halt the validate callback chain.

Options

  • :on - Specifies the contexts where this validation is active. Runs in all validation contexts by default nil. You can pass a symbol or an array of symbols. (e.g. on: :create or on: :custom_validation_context or on: [:create, :custom_validation_context])

  • :except_on - Specifies the contexts where this validation is not active. Runs in all validation contexts by default nil. You can pass a symbol or an array of symbols. (e.g. except: :create or except_on: :custom_validation_context or except_on: [:create, :custom_validation_context])

  • :if - Specifies a method or proc to call to determine if the validation should occur (e.g. if: :allow_validation, or if: Proc.new { |user| user.signup_step > 2 }). The method or proc should return or evaluate to a true or false value.

  • :unless - Specifies a method or proc to call to determine if the validation should not occur (e.g. unless: :skip_validation, or unless: Proc.new { |user| user.signup_step <= 2 }). The method or proc should return or evaluate to a true or false value.

NOTE: Calling validate multiple times on the same method will overwrite previous definitions.

Parameters

args rest
block block
Source
# File activemodel/lib/active_model/validations.rb, line 162
      def validate(*args, &block)
        options = args.extract_options!

        if args.all?(Symbol)
          options.each_key do |k|
            unless VALID_OPTIONS_FOR_VALIDATE.include?(k)
              raise ArgumentError.new("Unknown key: #{k.inspect}. Valid keys are: #{VALID_OPTIONS_FOR_VALIDATE.map(&:inspect).join(', ')}. Perhaps you meant to call `validates` instead of `validate`?")
            end
          end
        end

        if options.key?(:on)
          options = options.merge(if: [predicate_for_validation_context(options[:on]), *options[:if]])
        end

        if options.key?(:except_on)
          options = options.dup
          options[:except_on] = Array(options[:except_on])
          options[:unless] = [
            ->(o) { options[:except_on].intersect?(Array(o.validation_context)) },
            *options[:unless]
          ]
        end

        set_callback(:validate, *args, options, &block)
      end

Defined in activemodel/lib/active_model/validations.rb line 162 · View on GitHub · Improve this page · Find usages on GitHub

Defined in ActiveModel::Validations::ClassMethods

Type at least 2 characters to search.

↑↓ navigate · open · esc close