# Time to do something about validate & validates?

**URL:** <https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244>\
**Category:** rubyonrails-core\
**Created:** [December 13, 2013, 9:27am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244 "2013-12-13T09:27:00Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![\_matias](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/_matias/32/1631_2.png) [@\_matias](https://discuss.rubyonrails.org/u/_matias)\
**Post date:** [December 13, 2013, 9:27am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/1 "2013-12-13T09:27:00Z")

</div>

Hi,

I know this has been mentioned before, but could we do something about [validate](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate) and [validates](http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates)?

Having two methods with such similar names that do similar things but in a totally different way is extremely confusing. What’s more, if you do use validate instead of validates by mistake, no exceptions are raised and MyModel.valid? will return true.

I have trouble remembering which one I should be calling, and I’ve been working with Rails for years now. I can’t imagine how confused a novice programmer would be…

Perhaps renaming validate to something like validates\_with would be the way to go (with proper deprecation warnings, of course)?

Matias

---

<div class="post-metadata">

**Author:** ![\_matias](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/_matias/32/1631_2.png) [@\_matias](https://discuss.rubyonrails.org/u/_matias)\
**Post date:** [December 13, 2013, 10:05am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/2 "2013-12-13T10:05:28Z")

</div>

Whoops, not validates\_with since that already exists… Something else (what, I’m not sure).

---

<div class="post-metadata">

**Author:** ![Sergio\_Campama](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@Sergio\_Campama](https://discuss.rubyonrails.org/u/Sergio_Campama)\
**Post date:** [December 13, 2013, 11:02am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/3 "2013-12-13T11:02:42Z")

</div>

what about `validate_with`?

---

<div class="post-metadata">

**Author:** ![HappyNoff](https://avatars.discourse-cdn.com/v4/letter/h/8e7dd6/32.png) [@HappyNoff](https://discuss.rubyonrails.org/u/HappyNoff)\
**Post date:** [December 13, 2013, 11:06am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/4 "2013-12-13T11:06:31Z")

</div>

That wouldn’t really solve the problem since it would change the validate/validates situation to validate\_with/validates\_with.

Simon Courtois

---

<div class="post-metadata">

**Author:** ![Sergio\_Campama](https://avatars.discourse-cdn.com/v4/letter/s/7feea3/32.png) [@Sergio\_Campama](https://discuss.rubyonrails.org/u/Sergio_Campama)\
**Post date:** [December 13, 2013, 11:37am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/5 "2013-12-13T11:37:56Z")

</div>

exactly my point, I think we should add `validates_with` to the `validate` & `validates` issue…

---

<div class="post-metadata">

**Author:** ![vesan](https://sea2.discourse-cdn.com/rubyonrails/user_avatar/discuss.rubyonrails.org/vesan/32/702_2.png) [@vesan](https://discuss.rubyonrails.org/u/vesan)\
**Post date:** [December 13, 2013, 11:46am UTC](https://discuss.rubyonrails.org/t/time-to-do-something-about-validate-validates/68244/6 "2013-12-13T11:46:33Z")

</div>

Is there are a reason we couldn’t put `options.assert_valid_keys :on, :allow_nil, :allow_blank, :if, :unless` as the second line of the `validate` method?

Then if you intend to call `validates` but mistakenly call `validate` you would receive an ArgumentError. If you use them wrong the other way around, it will already give ArgumentError.

- Vesa Vänskä
