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.
Joshua M. (Guest)
on 2009-04-20 13: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
Joshua M. (Guest)
on 2009-04-20 13: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
Frederick C. (Guest)
on 2009-04-20 14:11
(Received via mailing list)
On Apr 20, 10:26 am, Joshua M. <removed_email_address@domain.invalid>
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
Joshua M. (Guest)
on 2009-04-20 16:10
Frederick C. wrote:
> On Apr 20, 10:26�am, Joshua M. <removed_email_address@domain.invalid>
> 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.