Skip to content

Commit

Permalink
feature(ruby-grape#2290) Use a param value as the default value of …
Browse files Browse the repository at this point in the history
…other param
  • Loading branch information
jcagarcia committed Nov 17, 2023
1 parent b34c722 commit 4c66ce8
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#### Features

* [](): Use a param value as the `default` value of other param - [@jcagarcia](https://github.com/jcagarcia).
* Your contribution here.

#### Fixes
Expand Down
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
6 changes: 5 additions & 1 deletion lib/grape/validations/validators/default_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 26 additions & 0 deletions spec/grape/validations/validators/default_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

0 comments on commit 4c66ce8

Please sign in to comment.