lib/grape/validations/validators/base.rb in grape-0.16.2 vs lib/grape/validations/validators/base.rb in grape-0.17.0

- old
+ new

@@ -33,22 +33,32 @@ # @param params [Hash] parameters to validate # @raise [Grape::Exceptions::Validation] if validation failed # @return [void] def validate!(params) attributes = AttributesIterator.new(self, @scope, params) - attributes.each do |resource_params, attr_name| - if @required || (resource_params.respond_to?(:key?) && resource_params.key?(attr_name)) + array_errors = [] + attributes.each do |resource_params, attr_name, inside_array| + next unless @required || (resource_params.respond_to?(:key?) && resource_params.key?(attr_name)) + + begin validate_param!(attr_name, resource_params) + rescue Grape::Exceptions::Validation => e + raise e unless inside_array + # we collect errors inside array because + # there may be more than one error per field + array_errors << e end end + + raise Grape::Exceptions::ValidationArrayErrors, array_errors if array_errors.any? end def self.convert_to_short_name(klass) ret = klass.name.gsub(/::/, '/') - .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') - .gsub(/([a-z\d])([A-Z])/, '\1_\2') - .tr('-', '_') - .downcase + .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') + .gsub(/([a-z\d])([A-Z])/, '\1_\2') + .tr('-', '_') + .downcase File.basename(ret, '_validator') end def self.inherited(klass) short_name = convert_to_short_name(klass)