Module: ActionArgs::ParamsHandler

Defined in:
lib/action_args/params_handler.rb

Class Method Summary collapse

Class Method Details

.extract_method_arguments_from_params(method_parameters, params) ⇒ Object

converts the request params Hash into an Array to be passed into the target Method



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/action_args/params_handler.rb', line 4

def self.extract_method_arguments_from_params(method_parameters, params)
  kwargs, missing_required_params = {}, []
  parameter_names = method_parameters.map(&:last)
  method_parameters.reverse_each do |type, key|
    case type
    when :req
      missing_required_params << key unless params.has_key? key
      next
    when :keyreq
      if params.has_key? key
        kwargs[key] = params[key]
      else
        missing_required_params << key
      end
    when :key
      kwargs[key] = params[key] if params.has_key? key
    when :opt
      break if params.has_key? key
    end
    # omitting parameters that are :block, :rest, :opt without a param, and :key without a param
    parameter_names.delete key
  end
  if missing_required_params.any?
    if defined? ActionController::BadRequest
      raise ActionController::BadRequest.new(:required, ArgumentError.new("Missing required parameters: #{missing_required_params.join(', ')}"))
    else
      raise ArgumentError, "Missing required parameters: #{missing_required_params.join(', ')}"
    end
  end

  values = parameter_names.map {|k| params[k]}
  values << kwargs if kwargs.any?
  values
end

.strengthen_params!(controller_class, method_parameters, params) ⇒ Object

permits declared model attributes in the params Hash note that this method mutates the given params Hash



41
42
43
44
45
46
47
48
49
50
# File 'lib/action_args/params_handler.rb', line 41

def self.strengthen_params!(controller_class, method_parameters, params)
  target_model_name = (controller_class.instance_variable_get(:'@permitting_model_name') || controller_class.name.sub(/.+::/, '').sub(/Controller$/, '')).singularize.underscore.tr('/', '_').to_sym
  permitted_attributes = controller_class.instance_variable_get :'@permitted_attributes'

  method_parameters.each do |type, key|
    if (key == target_model_name) && permitted_attributes
      params[key] = params.require(key).try :permit, *permitted_attributes
    end
  end
end