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.
Defined Under Namespace
Classes: EmptyOptionalValue
Instance Method Summary collapse
-
#all_or_none_of(*attrs) ⇒ Object
Require that either all given params are present, or none are.
-
#at_least_one_of(*attrs) ⇒ Object
Require at least one of the given parameters to be present.
-
#build_with(build_with = nil) ⇒ Object
Set the module used to build the request.params.
-
#declared_param?(param) ⇒ Boolean
Test for whether a certain parameter has been defined in this params block yet.
-
#exactly_one_of(*attrs) ⇒ Object
Require exactly one of the given parameters to be present.
-
#given(*attrs) { ... } ⇒ Object
Define a block of validations which should be applied if and only if the given parameter is present.
- #map_params(params, element, is_array = false) ⇒ Object
-
#mutually_exclusive(*attrs) ⇒ Object
Disallow the given parameters to be present in the same request.
-
#optional(*attrs, &block) ⇒ Object
Allow, but don't require, one or more parameters for the current endpoint.
-
#params(params) ⇒ Object
private
Hash of parameters relevant for the current scope.
-
#requires(*attrs, &block) ⇒ Object
(also: #group)
Require one or more parameters for the current endpoint.
-
#use(*names) ⇒ Object
(also: #use_scope, #includes)
Include reusable params rules among current.
-
#with(*attrs, &block) ⇒ Object
Define common settings for one or more parameters.
Instance Method Details
#all_or_none_of(*attrs) ⇒ Object
Require that either all given params are present, or none are.
197 198 199 |
# File 'lib/grape/dsl/parameters.rb', line 197 def all_or_none_of(*attrs) validates(attrs, all_or_none_of: { value: true, message: (attrs) }) end |
#at_least_one_of(*attrs) ⇒ Object
Require at least one of the given parameters to be present.
191 192 193 |
# File 'lib/grape/dsl/parameters.rb', line 191 def at_least_one_of(*attrs) validates(attrs, at_least_one_of: { value: true, message: (attrs) }) end |
#build_with(build_with = nil) ⇒ Object
Set the module used to build the request.params.
33 34 35 |
# File 'lib/grape/dsl/parameters.rb', line 33 def build_with(build_with = nil) @api.namespace_inheritable(:build_params_with, build_with) end |
#declared_param?(param) ⇒ Boolean
Test for whether a certain parameter has been defined in this params block yet.
219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/grape/dsl/parameters.rb', line 219 def declared_param?(param) if lateral? # Elements of @declared_params of lateral scope are pushed in @parent. So check them in @parent. @parent.declared_param?(param) else # @declared_params also includes hashes of options and such, but those # won't be flattened out. @declared_params.flatten.any? do |declared_param_attr| first_hash_key_or_param(declared_param_attr.key) == param end end end |
#exactly_one_of(*attrs) ⇒ Object
Require exactly one of the given parameters to be present.
185 186 187 |
# File 'lib/grape/dsl/parameters.rb', line 185 def exactly_one_of(*attrs) validates(attrs, exactly_one_of: { value: true, message: (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.
208 209 210 211 212 213 214 |
# File 'lib/grape/dsl/parameters.rb', line 208 def given(*attrs, &block) attrs.each do |attr| proxy_attr = first_hash_key_or_param(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, is_array = false) ⇒ Object
236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/grape/dsl/parameters.rb', line 236 def map_params(params, element, is_array = false) if params.is_a?(Array) params.map do |el| map_params(el, element, true) end elsif params.is_a?(Hash) params[element] || (@optional && is_array ? EmptyOptionalValue : {}) elsif params == EmptyOptionalValue EmptyOptionalValue else {} end end |
#mutually_exclusive(*attrs) ⇒ Object
Disallow the given parameters to be present in the same request.
179 180 181 |
# File 'lib/grape/dsl/parameters.rb', line 179 def mutually_exclusive(*attrs) validates(attrs, mutual_exclusion: { value: true, message: (attrs) }) end |
#optional(*attrs, &block) ⇒ Object
Allow, but don't require, one or more parameters for the current endpoint.
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/grape/dsl/parameters.rb', line 147 def optional(*attrs, &block) orig_attrs = attrs.clone opts = attrs..clone type = opts[:type] opts = @group.deep_merge(opts) if instance_variable_defined?(:@group) && @group # check type for optional parameter group if attrs && block raise Grape::Exceptions::MissingGroupType if type.nil? raise Grape::Exceptions::UnsupportedGroupType unless Grape::Validations::Types.group?(type) end if opts[:using] require_optional_fields(attrs.first, opts) else validate_attributes(attrs, opts, &block) block ? new_scope(orig_attrs, true, &block) : push_declared_params(attrs, **opts.slice(:as)) 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.
253 254 255 256 257 |
# File 'lib/grape/dsl/parameters.rb', line 253 def params(params) params = @parent.params(params) if instance_variable_defined?(:@parent) && @parent params = map_params(params, @element) if instance_variable_defined?(:@element) && @element params end |
#requires(*attrs, &block) ⇒ Object Also known as: group
Require one or more parameters for the current endpoint.
128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/grape/dsl/parameters.rb', line 128 def requires(*attrs, &block) orig_attrs = attrs.clone opts = attrs..clone opts[:presence] = { value: true, message: opts[:message] } opts = @group.deep_merge(opts) if instance_variable_defined?(:@group) && @group if opts[:using] require_required_and_optional_fields(attrs.first, opts) else validate_attributes(attrs, opts, &block) block ? new_scope(orig_attrs, &block) : push_declared_params(attrs, **opts.slice(:as)) 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.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/grape/dsl/parameters.rb', line 58 def use(*names) named_params = @api.namespace_stackable_with_hash(:named_params) || {} = names. names.each do |name| params_block = named_params.fetch(name) do raise "Params :#{name} not found!" end if .empty? instance_exec(, ¶ms_block) else instance_exec(**, ¶ms_block) end end end |
#with(*attrs, &block) ⇒ Object
Define common settings for one or more parameters
172 173 174 175 |
# File 'lib/grape/dsl/parameters.rb', line 172 def with(*attrs, &block) new_group_attrs = [@group, attrs.clone.first].compact.reduce(&:deep_merge) new_group_scope([new_group_attrs], &block) end |