class Grape::Validations::AttributesIterator

Attributes

scope[R]

Public Class Methods

new(validator, scope, params) click to toggle source
# File lib/grape/validations/attributes_iterator.rb, line 8
def initialize(validator, scope, params)
  @scope = scope
  @attrs = validator.attrs
  @original_params = scope.params(params)
  @params = Array.wrap(@original_params)
end

Public Instance Methods

each(&block) click to toggle source
# File lib/grape/validations/attributes_iterator.rb, line 15
def each(&block)
  do_each(@params, &block) # because we need recursion for nested arrays
end

Private Instance Methods

do_each(params_to_process, parent_indicies = []) { |resource_params, attr_name, inside_array| ... } click to toggle source
# File lib/grape/validations/attributes_iterator.rb, line 21
def do_each(params_to_process, parent_indicies = [], &block)
  params_to_process.each_with_index do |resource_params, index|
    # when we get arrays of arrays it means that target element located inside array
    # we need this because we want to know parent arrays indicies
    if resource_params.is_a?(Array)
      do_each(resource_params, [index] + parent_indicies, &block)
      next
    end

    if @scope.type == Array
      next unless @original_params.is_a?(Array) # do not validate content of array if it isn't array
      inside_array = true
    end
    if inside_array
      # fill current and parent scopes with correct array indicies
      parent_scope = @scope.parent
      parent_indicies.each do |parent_index|
        parent_scope.index = parent_index
        parent_scope = parent_scope.parent
      end
      @scope.index = index
    end

    @attrs.each do |attr_name|
      yield resource_params, attr_name, inside_array
    end
  end
end