class ShieldsUp::Parameters

Constants

PERMITTED_SCALAR_TYPES

Public Class Methods

new(params, controller) click to toggle source
# File lib/shields_up/parameters.rb, line 42
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
param_type() click to toggle source
# File lib/shields_up/parameters.rb, line 6
def self.param_type
  @param_type ||= if defined?(ActionController) && defined?(ActionController::Parameters)
    ActionController::Parameters
  else
    ActiveSupport::HashWithIndifferentAccess
  end
end

Public Instance Methods

[](key) click to toggle source
# File lib/shields_up/parameters.rb, line 78
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) click to toggle source
# File lib/shields_up/parameters.rb, line 53
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
permit!() click to toggle source
# File lib/shields_up/parameters.rb, line 74
def permit!
  deep_dup_to_hash(@params).symbolize_keys
end
require(key) click to toggle source
# File lib/shields_up/parameters.rb, line 70
def require(key)
  self[key] or raise ParameterMissing.new("Required parameter #{key} does not exist in #{to_s}")
end
to_s() click to toggle source
# File lib/shields_up/parameters.rb, line 49
def to_s
  @params.inspect
end
with_shields_down() { || ... } click to toggle source
# File lib/shields_up/parameters.rb, line 34
def with_shields_down
  saved = @controller.params
  @controller.params = @original_params
  yield
ensure
  @controller.params = saved
end

Private Instance Methods

deep_dup_to_hash(params) click to toggle source
# File lib/shields_up/parameters.rb, line 149
def deep_dup_to_hash(params)
  return dup_if_possible(params) unless params.is_a?(self.class.param_type)
  {}.tap do |dup|
    params.each do |key, value|
      dup[key] = deep_dup_to_hash(value)
    end
  end
end
dup_if_possible(v) click to toggle source
# File lib/shields_up/parameters.rb, line 158
def dup_if_possible(v)
  v.duplicable? ? v.dup : v
end
integer_key?(k) click to toggle source
# File lib/shields_up/parameters.rb, line 129
def integer_key?(k)
  k =~ /\A-?\d+\z/
end
permit_array_of_hashes(name, permissions) click to toggle source
# File lib/shields_up/parameters.rb, line 121
def permit_array_of_hashes(name, permissions)
  @params[name].zip(@original_params[name]).select{|el| el[0].is_a? Hash}.collect{|el| self.class.new(el[1], @controller).permit(*permissions)}
end
permit_nested(nested_name, permissions_for_nested) click to toggle source
# File lib/shields_up/parameters.rb, line 133
def permit_nested(nested_name, permissions_for_nested)
  if permissions_for_nested == [] # Declaration {:comment_ids => []}.
    @params[nested_name].is_a?(Array) ? permit_scalars(nested_name) : nil
  elsif @params[nested_name].is_a? Array # Declaration {:user => :name} or {:user => [:name, :age, {:adress => ...}]}.
    permit_array_of_hashes(nested_name, permissions_for_nested)
  elsif @params[nested_name].is_a?(Hash) && @params[nested_name].keys.all? { |k| integer_key?(k) } #{ '1' => {'title' => 'First Chapter'}, '2' => {'title' => 'Second Chapter'}}
    permit_nested_attributes_for(nested_name, permissions_for_nested)
  else
    permit_simple_hash(nested_name, permissions_for_nested)
  end
end
permit_nested_attributes_for(name, permissions) click to toggle source
# File lib/shields_up/parameters.rb, line 112
def permit_nested_attributes_for(name, permissions)
  {}.tap do |result|
    @params[name].each do |key, value|
      result[key] = self.class.new(@original_params[name][key], @controller).permit(*permissions) if value.is_a? Hash
      result[key] = value if permitted_scalar?(value)
    end
  end
end
permit_scalar(key) click to toggle source
# File lib/shields_up/parameters.rb, line 100
def permit_scalar(key)
  permitted_scalar?(@params[key]) ? @params[key] : nil
end
permit_scalars(name) click to toggle source
# File lib/shields_up/parameters.rb, line 125
def permit_scalars(name)
  @params[name].select { |element| permitted_scalar? element }
end
permit_simple_hash(name, permissions) click to toggle source
# File lib/shields_up/parameters.rb, line 104
def permit_simple_hash(name, permissions)
  if @params[name].is_a? Hash
    self.class.new(@original_params[name], @controller).permit(*permissions)
  else
    permit_scalar(name)
  end
end
permitted_scalar?(value) click to toggle source
# File lib/shields_up/parameters.rb, line 145
def permitted_scalar?(value)
  PERMITTED_SCALAR_TYPES.any? {|type| value.is_a?(type)}
end