Module: Grape::DSL::Parameters

Extended by:
ActiveSupport::Concern
Included in:
Validations::ParamsScope
Defined in:
lib/grape/dsl/parameters.rb

Overview

Defines DSL methods, meant to be applied to a ParamsScope, which define and describe the parameters accepted by an endpoint, or all endpoints within a namespace.

Instance Method Summary collapse

Instance Method Details

#all_or_none_of(*attrs) ⇒ Object

Require that either all given params are present, or none are.

Parameters:

  • attrs (*Symbol)

    parameters to validate


166
167
168
# File 'lib/grape/dsl/parameters.rb', line 166

def all_or_none_of(*attrs)
  validates(attrs, all_or_none_of: { value: true, message: extract_message_option(attrs) })
end

#at_least_one_of(*attrs) ⇒ Object

Require at least one of the given parameters to be present.

Parameters:

  • attrs (*Symbol)

    parameters to validate


160
161
162
# File 'lib/grape/dsl/parameters.rb', line 160

def at_least_one_of(*attrs)
  validates(attrs, at_least_one_of: { value: true, message: extract_message_option(attrs) })
end

#declared_param?(param) ⇒ Boolean

Test for whether a certain parameter has been defined in this params block yet.

Returns:

  • (Boolean)

    whether the parameter has been defined


188
189
190
191
192
# File 'lib/grape/dsl/parameters.rb', line 188

def declared_param?(param)
  # @declared_params also includes hashes of options and such, but those
  # won't be flattened out.
  @declared_params.flatten.include?(param)
end

#exactly_one_of(*attrs) ⇒ Object

Require exactly one of the given parameters to be present.

Parameters:

  • attrs (*Symbol)

    parameters to validate


154
155
156
# File 'lib/grape/dsl/parameters.rb', line 154

def exactly_one_of(*attrs)
  validates(attrs, exactly_one_of: { value: true, message: extract_message_option(attrs) })
end

#given(*attrs) { ... } ⇒ Object

Define a block of validations which should be applied if and only if the given parameter is present. The parameters are not nested.

Parameters:

  • attr (Symbol)

    the parameter which, if present, triggers the validations

Yields:

  • a parameter definition DSL

Raises:

  • Grape::Exceptions::UnknownParameter if attr has not been defined in this scope yet


177
178
179
180
181
182
183
# File 'lib/grape/dsl/parameters.rb', line 177

def given(*attrs, &block)
  attrs.each do |attr|
    proxy_attr = attr.is_a?(Hash) ? attr.keys[0] : attr
    raise Grape::Exceptions::UnknownParameter.new(proxy_attr) unless declared_param?(proxy_attr)
  end
  new_lateral_scope(dependent_on: attrs, &block)
end

#map_params(params, element) ⇒ Object


196
197
198
199
200
201
202
203
204
205
206
# File 'lib/grape/dsl/parameters.rb', line 196

def map_params(params, element)
  if params.is_a?(Array)
    params.map do |el|
      map_params(el, element)
    end
  elsif params.is_a?(Hash)
    params[element] || {}
  else
    {}
  end
end

#mutually_exclusive(*attrs) ⇒ Object

Disallow the given parameters to be present in the same request.

Parameters:

  • attrs (*Symbol)

    parameters to validate


148
149
150
# File 'lib/grape/dsl/parameters.rb', line 148

def mutually_exclusive(*attrs)
  validates(attrs, mutual_exclusion: { value: true, message: extract_message_option(attrs) })
end

#optional(*attrs, &block) ⇒ Object

Allow, but don't require, one or more parameters for the current endpoint.

Parameters:

  • attrs

    list of parameter names, or, if :using is passed as an option, which keys to include (:all or :none) from the :using hash. The last key can be a hash, which specifies options for the parameters

Options Hash (*attrs):

  • :type (Class)

    the type to coerce this parameter to before passing it to the endpoint. See Validations::Types for a list of types that are supported automatically. Custom classes may be used where they define a class-level ::parse method, or in conjunction with the :coerce_with parameter. JSON may be supplied to denote JSON-formatted objects or arrays of objects. Array[JSON] accepts the same values as JSON but will wrap single objects in an Array.

  • :types (Array<Class>)

    may be supplied in place of +:type+ to declare an attribute that has multiple allowed types. See Validations::Types::MultipleTypeCoercer for more details on coercion and validation rules for variant-type parameters.

  • :desc (String)

    description to document this parameter

  • :default (Object)

    default value, if parameter is optional

  • :values (Array)

    permissable values for this field. If any other value is given, it will be handled as a validation error

  • :using (Hash[Symbol => Hash])

    a hash defining keys and options, like that returned by Entity#documentation. The value of each key is an options hash accepting the same parameters

  • :except (Array[Symbol])

    a list of keys to exclude from the :using Hash. The meaning of this depends on if :all or :none was passed; :all + :except will make the :except fields optional, whereas :none + :except will make the :except fields required

  • :coerce_with (#parse, #call)

    method to be used when coercing the parameter to the type named by attrs[:type]. Any class or object that defines ::parse or ::call may be used.


117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/grape/dsl/parameters.rb', line 117

def optional(*attrs, &block)
  orig_attrs = attrs.clone

  opts = attrs.extract_options!.clone
  type = opts[:type]
  opts = @group.merge(opts) if @group

  # check type for optional parameter group
  if attrs && block_given?
    raise Grape::Exceptions::MissingGroupTypeError.new if type.nil?
    raise Grape::Exceptions::UnsupportedGroupTypeError.new unless Grape::Validations::Types.group?(type)
  end

  if opts[:using]
    require_optional_fields(attrs.first, opts)
  else
    validate_attributes(attrs, opts, &block)

    block_given? ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs)
  end
end

#params(params) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns hash of parameters relevant for the current scope

Parameters:

  • params (Hash)

    initial hash of parameters

Returns:

  • hash of parameters relevant for the current scope


211
212
213
214
215
# File 'lib/grape/dsl/parameters.rb', line 211

def params(params)
  params = @parent.params(params) if @parent
  params = map_params(params, @element) if @element
  params
end

#requires(*attrs, &block) ⇒ Object Also known as: group

Require one or more parameters for the current endpoint.

Examples:


params do
  # Basic usage: require a parameter of a certain type
  requires :user_id, type: Integer

  # You don't need to specify type; String is default
  requires :foo

  # Multiple params can be specified at once if they share
  # the same options.
  requires :x, :y, :z, type: Date

  # Nested parameters can be handled as hashes. You must
  # pass in a block, within which you can use any of the
  # parameters DSL methods.
  requires :user, type: Hash do
    requires :name, type: String
  end
end

Parameters:

  • attrs

    list of parameter names, or, if :using is passed as an option, which keys to include (:all or :none) from the :using hash. The last key can be a hash, which specifies options for the parameters

Options Hash (*attrs):

  • :type (Class)

    the type to coerce this parameter to before passing it to the endpoint. See Validations::Types for a list of types that are supported automatically. Custom classes may be used where they define a class-level ::parse method, or in conjunction with the :coerce_with parameter. JSON may be supplied to denote JSON-formatted objects or arrays of objects. Array[JSON] accepts the same values as JSON but will wrap single objects in an Array.

  • :types (Array<Class>)

    may be supplied in place of +:type+ to declare an attribute that has multiple allowed types. See Validations::Types::MultipleTypeCoercer for more details on coercion and validation rules for variant-type parameters.

  • :desc (String)

    description to document this parameter

  • :default (Object)

    default value, if parameter is optional

  • :values (Array)

    permissable values for this field. If any other value is given, it will be handled as a validation error

  • :using (Hash[Symbol => Hash])

    a hash defining keys and options, like that returned by Entity#documentation. The value of each key is an options hash accepting the same parameters

  • :except (Array[Symbol])

    a list of keys to exclude from the :using Hash. The meaning of this depends on if :all or :none was passed; :all + :except will make the :except fields optional, whereas :none + :except will make the :except fields required

  • :coerce_with (#parse, #call)

    method to be used when coercing the parameter to the type named by attrs[:type]. Any class or object that defines ::parse or ::call may be used.


97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/grape/dsl/parameters.rb', line 97

def requires(*attrs, &block)
  orig_attrs = attrs.clone

  opts = attrs.extract_options!.clone
  opts[:presence] = { value: true, message: opts[:message] }
  opts = @group.merge(opts) if @group

  if opts[:using]
    require_required_and_optional_fields(attrs.first, opts)
  else
    validate_attributes(attrs, opts, &block)

    block_given? ? new_scope(orig_attrs, &block) : push_declared_params(attrs)
  end
end

#use(*names) ⇒ Object Also known as: use_scope, includes

Include reusable params rules among current. You can define reusable params with helpers method.

Examples:


class API < Grape::API
  helpers do
    params :pagination do
      optional :page, type: Integer
      optional :per_page, type: Integer
    end
  end

  desc "Get collection"
  params do
    use :pagination
  end
  get do
    Collection.page(params[:page]).per(params[:per_page])
  end
end

32
33
34
35
36
37
38
39
40
41
# File 'lib/grape/dsl/parameters.rb', line 32

def use(*names)
  named_params = @api.namespace_stackable_with_hash(:named_params) || {}
  options = names.extract_options!
  names.each do |name|
    params_block = named_params.fetch(name) do
      raise "Params :#{name} not found!"
    end
    instance_exec(options, &params_block)
  end
end

#with(*attrs, &block) ⇒ Object

Define common settings for one or more parameters

Parameters:

  • attrs

    list of parameter names, or, if :using is passed as an option, which keys to include (:all or :none) from the :using hash. The last key can be a hash, which specifies options for the parameters

Options Hash (*attrs):

  • :type (Class)

    the type to coerce this parameter to before passing it to the endpoint. See Validations::Types for a list of types that are supported automatically. Custom classes may be used where they define a class-level ::parse method, or in conjunction with the :coerce_with parameter. JSON may be supplied to denote JSON-formatted objects or arrays of objects. Array[JSON] accepts the same values as JSON but will wrap single objects in an Array.

  • :types (Array<Class>)

    may be supplied in place of +:type+ to declare an attribute that has multiple allowed types. See Validations::Types::MultipleTypeCoercer for more details on coercion and validation rules for variant-type parameters.

  • :desc (String)

    description to document this parameter

  • :default (Object)

    default value, if parameter is optional

  • :values (Array)

    permissable values for this field. If any other value is given, it will be handled as a validation error

  • :using (Hash[Symbol => Hash])

    a hash defining keys and options, like that returned by Entity#documentation. The value of each key is an options hash accepting the same parameters

  • :except (Array[Symbol])

    a list of keys to exclude from the :using Hash. The meaning of this depends on if :all or :none was passed; :all + :except will make the :except fields optional, whereas :none + :except will make the :except fields required

  • :coerce_with (#parse, #call)

    method to be used when coercing the parameter to the type named by attrs[:type]. Any class or object that defines ::parse or ::call may be used.


142
143
144
# File 'lib/grape/dsl/parameters.rb', line 142

def with(*attrs, &block)
  new_group_scope(attrs.clone, &block)
end