Sha256: d284252ddd187ee0d9d8bfde42d9c3e1ed146c0e358402cc5c6b60ffc1919075

Contents?: true

Size: 1.63 KB

Versions: 14

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

module ActiveModel
  module Validations
    class OwnershipValidator < EachValidator
      WITH_OPTIONS = %w[String Symbol].freeze

      def validate_each(record, attribute, value)
        owner = record.send(options[:with])
        actual_owner = value ? value.send(options[:with]) : nil

        return unless value
        return if owner == actual_owner

        record.errors.add(
          attribute,
          :invalid_owner,
          message: options[:message]
        )
      end

      def check_validity!
        raise ArgumentError, ":with is required" unless options.key?(:with)
        raise ArgumentError, ":with option must be a string or a symbol" unless WITH_OPTIONS.include?(options[:with].class.name)
      end
    end

    module ClassMethods
      # Validates whether the owner of the specified attribute is the same from the current object.
      #
      #   class Task < ActiveRecord::Base
      #     belongs_to :user
      #     belongs_to :category
      #
      #     validates_ownership_of :category, with: :user
      #   end
      #
      #   user = User.find(1)
      #   another_user = User.find(2)
      #
      #   user_category = user.categories.first
      #   another_user_category = another_user.categories.first
      #
      #   task = user.tasks.create(category: user_category)
      #   task.valid?
      #   #=> true
      #
      #   task = user.tasks.create(category: another_user_category)
      #   task.valid?
      #   #=> false
      #
      def validates_ownership_of(*attr_names)
        validates_with OwnershipValidator, _merge_attributes(attr_names)
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
validators-3.4.2 lib/validators/validates_ownership_of.rb
validators-3.4.1 lib/validators/validates_ownership_of.rb
validators-3.4.0 lib/validators/validates_ownership_of.rb
validators-3.3.0 lib/validators/validates_ownership_of.rb
validators-3.2.1 lib/validators/validates_ownership_of.rb
validators-3.2.0 lib/validators/validates_ownership_of.rb
validators-3.1.1 lib/validators/validates_ownership_of.rb
validators-3.1.0 lib/validators/validates_ownership_of.rb
validators-3.0.5 lib/validators/validates_ownership_of.rb
validators-3.0.4 lib/validators/validates_ownership_of.rb
validators-3.0.3 lib/validators/validates_ownership_of.rb
validators-3.0.2 lib/validators/validates_ownership_of.rb
validators-3.0.1 lib/validators/validates_ownership_of.rb
validators-3.0.0 lib/validators/validates_ownership_of.rb