Module: Mongoid::MultiParameterAttributes

Defined in:
lib/mongoid/multi_parameter_attributes.rb

Overview

Adds Rails’ multi-parameter attribute support to Mongoid.

@todo: Durran: This module needs an overhaul.

Defined Under Namespace

Modules: Errors

Instance Method Summary collapse

Instance Method Details

#process(attrs = nil, role = :default, guard_protected_attributes = true) ⇒ Object

Process the provided attributes casting them to their proper values if a field exists for them on the document. This will be limited to only the attributes provided in the suppied Hash so that no extra nil values get put into the document’s attributes.

Examples:

Process the attributes.

person.process(:title => "sir", :age => 40)

Parameters:

  • attrs (Hash) (defaults to: nil)

    The attributes to set.

  • role (Symbol) (defaults to: :default)

    A role for scoped mass assignment.

  • guard_protected_attributes (Boolean) (defaults to: true)

    False to skip mass assignment protection.

Since:

  • 2.0.0.rc.7



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/mongoid/multi_parameter_attributes.rb', line 51

def process(attrs = nil, role = :default, guard_protected_attributes = true)
  if attrs
    errors = []
    attributes = {}
    multi_parameter_attributes = {}

    attrs.each_pair do |key, value|
      if key =~ /^([^\(]+)\((\d+)([if])\)$/
        key, index = $1, $2.to_i
        (multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
      else
        attributes[key] = value
      end
    end

    multi_parameter_attributes.each_pair do |key, values|
      begin
        values = (values.keys.min..values.keys.max).map { |i| values[i] }
        field = self.class.fields[key]
        attributes[key] = instantiate_object(field, values)
      rescue => e
        errors << Errors::AttributeAssignmentError.new(
          "error on assignment #{values.inspect} to #{key}", e, key
        )
      end
    end

    unless errors.empty?
      raise(
        Errors::MultiparameterAssignmentErrors.new(errors),
        "#{errors.size} error(s) on assignment of multiparameter attributes"
      )
    end

    super attributes, role, guard_protected_attributes
  else
    super
  end
end