Class: ShieldsUp::Parameters

Inherits:
Object
  • Object
show all
Defined in:
lib/shields_up/parameters.rb

Constant Summary collapse

PERMITTED_SCALAR_TYPES =
[
    String,
    Symbol,
    NilClass,
    Numeric,
    TrueClass,
    FalseClass,
    Date,
    Time,
    # DateTimes are Dates, we document the type but avoid the redundant check.
    StringIO,
    IO,
]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params, controller) ⇒ Parameters

Returns a new instance of Parameters.



40
41
42
43
44
45
# File 'lib/shields_up/parameters.rb', line 40

def initialize(params, controller)
  raise UnsupportedParameterType.new unless params.is_a? ActiveSupport::HashWithIndifferentAccess
  @original_params = params
  @controller = controller
  @params = deep_dup_to_hash(params)
end

Class Method Details

.param_typeObject



4
5
6
7
8
9
10
# File 'lib/shields_up/parameters.rb', line 4

def self.param_type
  @param_type ||= if defined?(ActionController) && defined?(ActionController::Parameters)
    ActionController::Parameters
  else
    ActiveSupport::HashWithIndifferentAccess
  end
end

Instance Method Details

#[](key) ⇒ Object

def permit!

deep_dup_to_hash(@params).symbolize_keys

end



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/shields_up/parameters.rb', line 76

def [](key)
  key = key.to_s
  value = @params[key]
  if value.is_a?(Hash)
    self.class.new(@original_params[key], @controller)
  elsif value.is_a?(Array)
    [].tap do |array|
      value.each_with_index do |element, i|
        if permitted_scalar?(element)
          array << element
        elsif element.is_a? Hash
          array << self.class.new(@original_params[key][i], @controller)
        end
      end
    end
  else
    permit_scalar(key)
  end
end

#permit(*permissions) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/shields_up/parameters.rb', line 51

def permit(*permissions)
  {}.tap do |permitted|
    permissions.each do |permission|
      permission, key = (permission.is_a?(Symbol) || permission.is_a?(String)) ? [permission, permission.to_s] : [permission.values.first, permission.keys.first.to_s]
      if @params.has_key?(key)
        if permission.is_a?(Symbol) || permission.is_a?(String)
            result = permit_scalar(key)
            permitted[key] = result if @params[key] == result
        else
          result = permit_nested(key, permission)
          permitted[key] = result if result
        end
      end
    end
  end.symbolize_keys
end

#require(key) ⇒ Object



68
69
70
# File 'lib/shields_up/parameters.rb', line 68

def require(key)
  self[key] or raise ParameterMissing.new("Required parameter #{key} does not exist in #{to_s}")
end

#to_sObject



47
48
49
# File 'lib/shields_up/parameters.rb', line 47

def to_s
  @params.inspect
end

#with_shields_downObject



32
33
34
35
36
37
38
# File 'lib/shields_up/parameters.rb', line 32

def with_shields_down
  saved = @controller.params
  @controller.params = @original_params
  yield
ensure
  @controller.params = saved
end