Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: validators checking aliased param instead of original one #1852

Merged
merged 3 commits into from Dec 21, 2018
Merged

fix: validators checking aliased param instead of original one #1852

merged 3 commits into from Dec 21, 2018

Conversation

glaucocustodio
Copy link
Contributor

Hi folks.

I've pointed a scenario and I would like to hear from you whether it is a bug or not.

Please, see the comments next the code.

subject.get('/alias-not-blank-with-value') {}
get '/alias-not-blank-with-value', foo: 'any'

expect(last_response.status).to eq(200)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get status 400 here with the last_response.body = foo is empty.

As the alias (as) is called before the allow_blank, it deletes the foo key from params and sets params[:bar] with its value.

Given that alias is just for internal usage (inside get block I mean), I think this should not fail, cause the foo param was given as expected. Do you agree?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd tend to agree that this looks like a bug to me. Could you open an issue for this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Thanks for looking at this!)

@dblock
Copy link
Member

dblock commented Dec 18, 2018

Looks like a bug.

@glaucocustodio glaucocustodio changed the title Alias behavior. Is that a bug? fix: validators checking aliased param instead of original one Dec 18, 2018
@@ -293,6 +293,8 @@ def validates(attrs, validations)
# type casted values
coerce_type validations, attrs, doc_attrs, opts

move_alias_to_end(validations)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't reused, and we do a ton of things above, so I would just inline the two lines of the method here.

I think delete also always makes a copy, and we should assume a nil value is a thing, so to be consistent I what we do above:

# explain why
validations[:as] = validations.delete(:as) if validations.key?(:as)

Copy link
Member

@dblock dblock Dec 18, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Errrr.... re-reading the code we move that :as to the "end". I understand why it works, but feels to me that it's wrong to rely on the order in validations which is not a visibly ordered array or hash.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that relying on the order is not good, but that was the easier way I found to fix the bug so far.

Another approach would be set a variable to let others validators know about alias, but it seems to be a bigger change and I am not sure whether the outcome would be worth..

Please let me know whether you have more ideas.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just don't think we can use on this approach to work reliably. There're no ordering guarantees. I think extracting as somehow is the proper way of doing it. Give it a try! We're here to help.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check the new approach now please. Build is failing because of rubocop lib/grape/endpoint.rb:6:3: C: Class has too many lines. [295/288].

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Run rubocop -a ; rubocop --auto-gen-config for this.

Copy link
Member

@dblock dblock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So why does this work? We remove aliased params in the validators, shouldn't that accomplish the same thing?

lib/grape/endpoint.rb Show resolved Hide resolved
@dblock dblock merged commit b645fb4 into ruby-grape:master Dec 21, 2018
@dblock
Copy link
Member

dblock commented Dec 21, 2018

Merged, thank you.

@glaucocustodio glaucocustodio deleted the as-behavior branch December 21, 2018 16:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants