diff --git a/CHANGELOG.md b/CHANGELOG.md index e85f6072d1..55682fecdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ -### 2.0.1 (Next) +### 2.1.0 (Next) #### 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..58d391f7bd 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ content negotiation, versioning and much more. ## Stable Release -You're reading the documentation for the next release of Grape, which should be **2.0.1**. +You're reading the documentation for the next release of Grape, which should be **2.1.0**. Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version. The current stable release is [2.0.0](https://github.com/ruby-grape/grape/blob/v2.0.0/README.md). @@ -1242,6 +1242,15 @@ 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/lib/grape/version.rb b/lib/grape/version.rb index df942655ae..1013166e1a 100644 --- a/lib/grape/version.rb +++ b/lib/grape/version.rb @@ -2,5 +2,5 @@ module Grape # The current version of Grape. - VERSION = '2.0.1' + VERSION = '2.1.0' end 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