From 08eaf10f6212bc6f432a10532b911b16573a23c1 Mon Sep 17 00:00:00 2001 From: Juan Carlos Garcia Date: Fri, 17 Nov 2023 14:01:53 +0100 Subject: [PATCH] feature(#2290): Use a param value as the `default` value of other param --- CHANGELOG.md | 1 + README.md | 11 ++++++++ .../validators/default_validator.rb | 6 ++++- .../validations/validators/default_spec.rb | 26 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d85e957e9..3f73e6323b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ #### Features +* [#2371](https://github.com/ruby-grape/grape/pull/2371): Use a param value as the `default` value of other param - [@jcagarcia](https://github.com/jcagarcia). * Your contribution here. #### Fixes diff --git a/README.md b/README.md index 81d6ddc810..831a81822a 100644 --- a/README.md +++ b/README.md @@ -1242,6 +1242,17 @@ params do end ``` +You can use the value of one parameter as the default value of some other parameter. In this +case, if the `primary_color` parameter is not provided, it will have the same value as the `color` +one. If both of them not provided, both of them will have `blue` value. + +```ruby +params do + optional :color, type: String, default: 'blue' + optional :primary_color, type: String, default: -> (params) { params[:color] } +end +``` + ### Supported Parameter Types The following are all valid types, supported out of the box by Grape: diff --git a/lib/grape/validations/validators/default_validator.rb b/lib/grape/validations/validators/default_validator.rb index 4058d7b1dd..9a59e5da15 100644 --- a/lib/grape/validations/validators/default_validator.rb +++ b/lib/grape/validations/validators/default_validator.rb @@ -11,7 +11,11 @@ def initialize(attrs, options, required, scope, **opts) def validate_param!(attr_name, params) params[attr_name] = if @default.is_a? Proc - @default.call + if @default.parameters.empty? + @default.call + else + @default.call(params) + end elsif @default.frozen? || !@default.duplicable? @default else diff --git a/spec/grape/validations/validators/default_spec.rb b/spec/grape/validations/validators/default_spec.rb index 980fa23044..2bb59792d8 100644 --- a/spec/grape/validations/validators/default_spec.rb +++ b/spec/grape/validations/validators/default_spec.rb @@ -89,6 +89,19 @@ get '/another_nested_optional_array' do { root: params[:root] } end + + params do + requires :foo + optional :bar, default: ->(params) { params[:foo] } + optional :qux, default: ->(params) { params[:bar] } + end + get '/default_values_from_other_params' do + { + foo: params[:foo], + bar: params[:bar], + qux: params[:qux] + } + end end end @@ -460,4 +473,17 @@ def app expect(JSON.parse(last_response.body)).to eq(expected) end end + + it 'sets default value for optional params using other params values' do + expected_foo_value = 'foo-value' + + get("/default_values_from_other_params?foo=#{expected_foo_value}") + + expect(last_response.status).to eq(200) + expect(last_response.body).to eq({ + foo: expected_foo_value, + bar: expected_foo_value, + qux: expected_foo_value + }.to_json) + end end