class ActionController::Parameters

Constants

NEVER_UNPERMITTED_PARAMS

Never raise an UnpermittedParameters exception because of these params are present. They are added by Rails and it's of no concern.

Attributes

permitted[RW]
permitted?[RW]

Public Class Methods

new(attributes = nil) click to toggle source
Calls superclass method
# File lib/action_controller/parameters.rb, line 33
def initialize(attributes = nil)
  super(attributes)
  @permitted = false
end

Public Instance Methods

[](key) click to toggle source
Calls superclass method
# File lib/action_controller/parameters.rb, line 85
def [](key)
  convert_hashes_to_parameters(key, super)
end
dup() click to toggle source
# File lib/action_controller/parameters.rb, line 101
def dup
  duplicate = Parameters.new(self)
  duplicate.instance_variable_set :@permitted, @permitted
  duplicate
end
fetch(key, *args) click to toggle source
Calls superclass method
# File lib/action_controller/parameters.rb, line 89
def fetch(key, *args)
  convert_hashes_to_parameters(key, super)
rescue KeyError, IndexError
  raise ActionController::ParameterMissing.new(key)
end
permit(*filters) click to toggle source
# File lib/action_controller/parameters.rb, line 54
def permit(*filters)
  params = self.class.new

  filters.each do |filter|
    case filter
    when Symbol, String then
      params[filter] = self[filter] if has_key?(filter)
      keys.grep(/\A#{Regexp.escape(filter.to_s)}\(\d+[if]?\)\z/).each { |key| params[key] = self[key] }
    when Hash then
      self.slice(*filter.keys).each do |key, value|
        return unless value

        key = key.to_sym

        params[key] = each_element(value) do |value|
          # filters are a Hash, so we expect value to be a Hash too
          next if filter.is_a?(Hash) && !value.is_a?(Hash)

          value = self.class.new(value) if !value.respond_to?(:permit)

          value.permit(*Array.wrap(filter[key]))
        end
      end
    end
  end

  unpermitted_parameters!(params) if self.class.action_on_unpermitted_parameters

  params.permit!
end
permit!() click to toggle source
# File lib/action_controller/parameters.rb, line 38
def permit!
  each_pair do |key, value|
    convert_hashes_to_parameters(key, value)
    self[key].permit! if self[key].respond_to? :permit!
  end

  @permitted = true
  self
end
require(key) click to toggle source
# File lib/action_controller/parameters.rb, line 48
def require(key)
  self[key].presence || raise(ActionController::ParameterMissing.new(key))
end
Also aliased as: required
required(key)
Alias for: require
slice(*keys) click to toggle source
Calls superclass method
# File lib/action_controller/parameters.rb, line 95
def slice(*keys)
  self.class.new(super).tap do |new_instance|
    new_instance.instance_variable_set :@permitted, @permitted
  end
end

Protected Instance Methods

convert_value(value) click to toggle source
# File lib/action_controller/parameters.rb, line 108
def convert_value(value)
  if value.class == Hash
    self.class.new(value)
  elsif value.is_a?(Array)
    value.dup.replace(value.map { |e| convert_value(e) })
  else
    value
  end
end

Private Instance Methods

convert_hashes_to_parameters(key, value) click to toggle source
# File lib/action_controller/parameters.rb, line 119
def convert_hashes_to_parameters(key, value)
  if value.is_a?(Parameters) || !value.is_a?(Hash)
    value
  else
    # Convert to Parameters on first access
    self[key] = self.class.new(value)
  end
end
each_element(object) { |el| ... } click to toggle source
# File lib/action_controller/parameters.rb, line 128
def each_element(object)
  if object.is_a?(Array)
    object.map { |el| yield el }.compact
  # fields_for on an array of records uses numeric hash keys
  elsif object.is_a?(Hash) && object.keys.all? { |k| k =~ /\A-?\d+\z/ }
    hash = object.class.new
    object.each { |k,v| hash[k] = yield v }
    hash
  else
    yield object
  end
end
unpermitted_keys(params) click to toggle source
# File lib/action_controller/parameters.rb, line 156
def unpermitted_keys(params)
  self.keys - params.keys - NEVER_UNPERMITTED_PARAMS
end
unpermitted_parameters!(params) click to toggle source
# File lib/action_controller/parameters.rb, line 141
def unpermitted_parameters!(params)
  return unless self.class.action_on_unpermitted_parameters

  unpermitted_keys = unpermitted_keys(params)

  if unpermitted_keys.any?
    case self.class.action_on_unpermitted_parameters
    when :log
      ActionController::Base.logger.debug "Unpermitted parameters: #{unpermitted_keys.join(", ")}"
    when :raise
      raise ActionController::UnpermittedParameters.new(unpermitted_keys)
    end
  end
end