Forum: Ruby on Rails xxx.valid? still true after xxx.errors.add(...)?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fc582698581884352e745d1d4c64699d?d=identicon&s=25 Joshua Muheim (josh)
on 2009-04-20 11:17
Hi all

I have the following code in my controller:

    if @comment.valid?
      captcha_url =
"http://captchator.com/captcha/check_answer/#{captc...
      result = open(captcha_url)
      unless result.read == "1"
        @comment.errors.add(:captcha, "Captcha wurde nicht korrekt
eingegeben")
        raise "#{@comment.valid?}"
      end
    end

Although I'm adding an error to :captcha, when I raise @comment.valid?
on the next line this still gives me true! Why is that? I just added an
error to @comment, didn't I?!

Maybe it's because I'm only using an attr_accessor for captcha?

class Comment < ActiveRecord::Base
  validates_presence_of :captcha
  attr_accessor :captcha
end

Thanks
Josh
Fc582698581884352e745d1d4c64699d?d=identicon&s=25 Joshua Muheim (josh)
on 2009-04-20 11:26
Well, it seems that obj.valid? and obj.save remove all manually added
errors?!

      @comment.errors.add_to_base("Captcha wurde nicht korrekt
eingegeben")
      raise "valid? #{@comment.valid?} - errors:
#{@comment.errors.inspect}"

results in "valid? false - errors: #<ActiveRecord::Errors:0x23d028c
@base=#<Comment id: nil, commentable_id: 38313, user_id: 1, subject: "",
body: "", created_at: nil, updated_at: nil, commentable_type:
"Article">, @errors={"body"=>["can't be blank"], "subject"=>["can't be
blank"]}>"

and

      raise "errors: #{@comment.errors.inspect}"

results in "errors: #<ActiveRecord::Errors:0x1878538 @base=#<Comment id:
nil, commentable_id: 38313, user_id: 1, subject: "", body: "",
created_at: nil, updated_at: nil, commentable_type: "Article">,
@errors={"base"=>["Captcha wurde nicht korrekt eingegeben"]}>"

Why the heck does ActiveRecord remove my custom errors when calling
.valid???

Thanks a lot for help
Josh
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-04-20 12:11
(Received via mailing list)
On Apr 20, 10:26 am, Joshua Muheim <rails-mailing-l...@andreas-s.net>
wrote:
> body: "", created_at: nil, updated_at: nil, commentable_type:
> @errors={"base"=>["Captcha wurde nicht korrekt eingegeben"]}>"
>
> Why the heck does ActiveRecord remove my custom errors when calling
> .valid???

Calling valid? recomputes the errors (there's no difference at the end
of the day between an error you added yourself and one from a 'normal'
validations. If you want to add errors yourself you should be doing so
from a validation

Fred
Fc582698581884352e745d1d4c64699d?d=identicon&s=25 Joshua Muheim (josh)
on 2009-04-20 14:10
Frederick Cheung wrote:
> On Apr 20, 10:26�am, Joshua Muheim <rails-mailing-l...@andreas-s.net>
> wrote:
>> body: "", created_at: nil, updated_at: nil, commentable_type:
>> @errors={"base"=>["Captcha wurde nicht korrekt eingegeben"]}>"
>>
>> Why the heck does ActiveRecord remove my custom errors when calling
>> .valid???
>
> Calling valid? recomputes the errors (there's no difference at the end
> of the day between an error you added yourself and one from a 'normal'
> validations. If you want to add errors yourself you should be doing so
> from a validation
>
> Fred

OK, Thanks for the explanation :-)
This topic is locked and can not be replied to.