# How to display error messages for a child resource that failed validation

**URL:** <https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444>\
**Category:** Rails\
**Created:** [April 23, 2010, 9:27am UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444 "2010-04-23T09:27:46Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Matthew\_Hillsboroug](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ac91a4/32.png) [@Matthew\_Hillsboroug](https://www.ruby-forum.com/u/Matthew_Hillsboroug)\
**Post date:** [April 23, 2010, 9:27am UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444/1 "2010-04-23T09:27:46Z")

</div>

Can anyone explain why this happens?

```
mybox:$ ruby script/console
Loading development environment (Rails 2.3.5)
>> foo = Foo.new
=> #<Foo id: nil, customer_id: nil, created_at: nil, updated_at:

```

nil\>  
\>\> bar = Bar.new  
=\> #\<Bar id: nil, bundle\_id: nil, alias: nil, real: nil, active:  
true, list\_type: 0, body\_record\_active: false, created\_at: nil,  
updated\_at: nil\>  
\>\> bar.save  
=\> false  
\>\> bar.errors.each\_full { |msg| puts msg }  
Real can’t be blank  
Real You must supply a valid email  
=\> [“Real can’t be blank”, “Real You must supply a valid email”]

So far that is perfect, that is what i want the error message to read.  
Now for more:

```
>> foo.bars << bar
=> [#<Bar id: nil, bundle_id: nil, alias: nil, real: nil, active:

```

true, list\_type: 0, body\_record\_active: false, created\_at: nil,  
updated\_at: nil\>]  
\>\> foo.save  
=\> false  
\>\> foo.errors.to\_xml  
=\> “\<?xml version=\"1.0\" encoding=\"UTF-8\"?\>\n\n  
Bars is invalid\n\n”

That is what I can’t figure out. Why am I getting Bars is invalid  
versus the error messages displayed above, [“Real can’t be blank”,  
“Real you must supply a valid email”] etc.

My controller simply has a respond\_to method with the following in it:

```
 format.xml { render :xml => @foo.errors, :status

```

=\> :unprocessable\_entity }

How do I have this output the real error messages so the user has some  
insight into what they did wrong? How do I write my render method in  
my controller to show all of the appropriate error messages? And more  
important, what will my xml builder view look?

---

<div class="post-metadata">

**Author:** ![Matthew\_Hillsboroug](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ac91a4/32.png) [@Matthew\_Hillsboroug](https://www.ruby-forum.com/u/Matthew_Hillsboroug)\
**Post date:** [April 23, 2010, 11:50am UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444/2 "2010-04-23T11:50:36Z")

</div>

On 23 April 2010 01:23, Matthew Hillsborough  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> That is what I can’t figure out. Why am I getting Bars is invalid  
> versus the error messages displayed above, [“Real can’t be blank”,  
> “Real you must supply a valid email”] etc.
> 
> How do I have this output the real error messages so the user has some  
> insight into what they did wrong? How do I write my render method in  
> my controller to show all of the appropriate error messages? And more  
> important, what will my xml builder view look?

I tend to use the “merge errors” process gleaned from  
[http://dev.rubyonrails.org/attachment/ticket/11394/merge\_bang\_errors.patch](http://dev.rubyonrails.org/attachment/ticket/11394/merge_bang_errors.patch)

> <https://gist.github.com/Pavling/376389>

Then in your controller you can use:

@foo.errors.merge! bar.errors

… and the view will work as normal, but with nice errors 🙂

---

<div class="post-metadata">

**Author:** ![Matthew\_Hillsboroug](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ac91a4/32.png) [@Matthew\_Hillsboroug](https://www.ruby-forum.com/u/Matthew_Hillsboroug)\
**Post date:** [May 7, 2010, 9:46pm UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444/3 "2010-05-07T21:46:18Z")

</div>

I am not sure about best practice but I created a file config/  
initializers/active\_record.rb  
with the content of [merge\_errors.rb · GitHub](http://gist.github.com/376389) and reload the  
server.

as far as I understand, the initializers folder is the place to have  
stuff you want to load at startup for all environments.  
And what Michael’s code is doing is opening the class Errors inside  
ActiveRecord module and adding the method merge!

please correct me if it’s not accurate.  
also, where can I find more insights about the initialize process?

On Apr 23, 1:57 pm, Matthew Hillsborough

---

<div class="post-metadata">

**Author:** ![Matthew\_Hillsboroug](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ac91a4/32.png) [@Matthew\_Hillsboroug](https://www.ruby-forum.com/u/Matthew_Hillsboroug)\
**Post date:** [April 23, 2010, 3:58pm UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444/4 "2010-04-23T15:58:48Z")

</div>

Michael,

Thank you for this, I will try it right away.

Mind if I ask where the best place to put this code in as a best  
practice  
for Rails?

Matthew

---

<div class="post-metadata">

**Author:** ![Matthew\_Hillsboroug](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ac91a4/32.png) [@Matthew\_Hillsboroug](https://www.ruby-forum.com/u/Matthew_Hillsboroug)\
**Post date:** [May 8, 2010, 12:10am UTC](https://www.ruby-forum.com/t/how-to-display-error-messages-for-a-child-resource-that-failed-validation/187444/5 "2010-05-08T00:10:53Z")

</div>

I improved this solution by adding a method that removes the rails  
default message (‘child model is invalid’)  
but keeps all the rest:  
(notice the call to merge! at the end)

show\_child\_errors(@key, value, “translation\_values”)

def show\_child\_errors(parent, child, collection\_name)  
errors = parent.errors.each{|attr,msg| attr }  
if errors.include?(collection\_name)  
#keep all other errors  
keep\_errors = parent.errors.select{|attr,msg| attr !=  
collection\_name }  
parent.errors.clear  
keep\_errors.each do |e|  
parent.errors.add(e.first, e.second)  
end  
parent.errors.merge!(child.errors)  
end  
end

I am not
