69

I just upgraded my rails to 2.3.4 and I noticed this with validations: Lets say I have a simple model Company which has a name. nothing to it. I want to run my own validation:

class Company < ActiveRecord::Base

  validate :something


  def something
    false
  end

end

saving the model actually works in this case. The same thing happens if i override validate() and return false. I noticed this in a more complex model where my validation was returning false, but the object was still saving...I tried it out in an essentially empty model and the same thing applied. Is there a new practice I am missing? This doesn't seem to be the case in some of my older rails code.

1
  • Thank you. That is almost definitely the case. I assume with the new project I forgot to add errors, and with the older ones I definitely had them in there. Duh. thank you all. Commented Oct 23, 2009 at 7:50

3 Answers 3

118

Your validations are executed when you use the validate method. However rails doesn't relies on the returned value.

It relies on if there are validations errors or not. So you should add errors when your model doesn't validates.

def something
    errors.add(:field, 'error message')
end

Or, if the error is not related to a field :

def something
    errors.add(:base, 'error message')
end

Then your model won't be saved because there are errors.

Sign up to request clarification or add additional context in comments.

1 Comment

add_to_base is no longer correct as of Rails 3. See @MagedMakled's answer.
16

You're getting confused between validations and callbacks.

Validations are supposed to fail if there are any errors on the object, doesn't matter what the validation returns. Callbacks fail if they return false, regardless if they add any errors to object.

Rails uses calls valid? from save calls which does not check the result of any validations.

Edit: Rails treats validate :method as a callback, but valid? still doesn't check for their results, only for errors they added to the object.

I don't think this behaviour changed at all but I could be wrong. I don't think I've ever written a validation to return false before.

1 Comment

I was trying to create a validation for new_records so I created a method for use with the callback Obj.before_validation_on_create and added some base errors. However, the object would be created even when my callback added a base error. It only worked when I made my callback return "false" like you suggested! Thanks for pointing out how to make the callback fail
8

Just FYI errors.add_to_base('error message') has been deprecated in rails 3 and got replaced by

errors[:base] << "Error message" 

Or

errors.add(:base, "Error message")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.