Pivotal Labs

Main menu

Skip to primary content
Skip to secondary content
  • About
  • Case Studies
  • Team
    • Executives
    • Locations
      • San Francisco (HQ)
      • Boston
      • Boulder
      • Denver
      • London
      • Los Angeles
      • New York
  • Community
    • Blogs
    • Tech Talks
    • Events
  • Careers
    • Lifestyle
    • Principles & Practices
    • Benefits
    • FAQ
    • Apply
  • Contact
    • Press Room
    • Press Releases
    • In The News
    • Press Kit
  • All
  • Labs
  • Standup
  • Tracker

alias_method_chain :validates_associated, :informative_error_message

Pivotal Labs
Friday, January 4, 2008

I dislike the vague error message produced by validates_associated.

class User
  validates_associated :profile
  delegate ..., :to => :profile
end

I see the following error message: profile is invalid. But WHY was the profile invalid? The validation errors from the profile should bubble up to the user. So,

module ActiveRecord::Validations::ClassMethods
  def validates_associated(association, options = {})
    class_eval do
      validates_each(association) do |record, associate_name, value|
        associate = record.send(associate_name)
        if associate && !associate.valid?
          associate.errors.each do |key, value|
            record.errors.add(key, value)
          end
        end
      end
    end
  end
end

Now we see:

Music tastes can't be blank

Eh, voila!

  • 0 Shares
  • Share on Facebook
  • Share on Twitter

8 Comments

  1. Joshua says:

    I really like this, but it seems to only work with has_one associations. Here’s my adaptation, for better or worse:

    def validates_associated(*associations)
    associations.each do |association|
    class_eval do
    validates_each(associations) do |record, associate_name, value|
    associates = record.send(associate_name)
    associates = [associates] unless associates.respond_to?(‘each’)
    associates.each do |associate|
    if associate && !associate.valid?
    associate.errors.each do |key, value|
    record.errors.add(key, value)
    end
    end
    end
    end
    end
    end
    end

    January 24, 2008 at 3:04 pm

  2. Joshua says:

    Geeez, that’s ugly. Try here: http://pastie.caboo.se/142774

    January 24, 2008 at 3:06 pm

  3. sandro says:

    ##Perfect!
    This was super helpful, thanks for solving such an annoying problem.

    April 29, 2008 at 12:20 am

  4. fadhli says:

    Hi, thanks for the tips.

    Excuse me for this probably stupid question but where do I put that piece of code?

    Thanks

    May 26, 2008 at 12:12 pm

  5. Nathan Bertram says:

    Thanks for the solution. Had a problem with duplicated error messages due to the way we were handling nested models. Here’s a quick solution to remove those duplicates:

    http://pastie.org/350618

    @fadhli simply throw that code in any .rb file in /config/initializers and it will be automatically run =)

    January 2, 2009 at 3:50 pm

  6. Wolfram Arnold says:

    Actually, the code posted by Joshua and Nathan contains one loop too many. This is responsible for the duplication of error messages. Also Nick’s code throws away the value (block parameter) and then gets the same thing again by calling record.send(associate_name). That’s redundant. With these cleanups, the has_many validation code reduces to:

    http://pastie.org/365402

    January 20, 2009 at 4:16 am

  7. Johnathan Niziol says:

    I have had problems performing a conditional validation when I implement any of these extensions. Has anyone else encountered similar situations?

    I suspect that it expecting the :if to be another attribute to validate.

    January 30, 2009 at 2:56 pm

  8. Johnathan Niziol says:

    I found Nathan’s worked well, but like I said earlier, doesn’t take validates_associated :foo, :if => :bar.

    This one does though:

    http://www.pastie.org/382024

    February 6, 2009 at 9:23 pm

Add New Comment Cancel reply

Your email address will not be published.

Pivotal Labs

Pivotal Labs

Recent Posts

  • Does the set of all sets contain itself?
  • Standup 3/8/2012
  • Standup 3/7/2012
Subscribe to Pivotal's Feed

Author Topics

riddles (1)
agile (167)
capistrano (2)
rails (26)
movember (1)
git (10)
railsdoc (1)
object-design (1)
bdd (3)
cucumber (3)
linkedin (1)
oauth (1)
ruby (17)
tdd (2)
lvh.me (1)
rails 3.1.1 (1)
selenium (6)
homebrew (1)
mysql (5)
rvm (1)
sproutcore (1)
paperclip (2)
pry (1)
amazon (1)
heroku (1)
rails3 (2)
jasmine (3)
design (3)
process (12)
productivity (8)
learning (1)
olin (1)
migrations (2)
mongodb (2)
devise (2)
javascript (13)
rubymine (4)
ipad (1)
whurl (1)
head.js (1)
pairing (2)
tools (4)
pair programming (1)
rspec (10)
rspec2 (1)
ruby19 (1)
incubation (3)
startup (5)
api (1)
presenter (1)
vanna (1)
pivotal tracker (5)
capybara (1)
fakeweb (1)
webmock (1)
intern (1)
ruby on rails (25)
meetup (1)
textmate (1)
testing (20)
solr (4)
nyc-standup (11)
community (1)
opensource (3)
activerecord (4)
chrome (1)
mp4 (1)
activeresource (1)
flash (3)
neo4j (1)
nginx (1)
rsoc (1)
meta programming (1)
agile standup (7)
government (3)
webos (4)
xss (1)
jquery (1)
bundler (2)
ci (3)
gems (5)
postgresql (1)
geminstaller (1)
gemcutter (1)
cloud (2)
rack (2)
refraction (1)
gem (5)
refactoring (1)
validations (1)
webrat (1)
engine-yard (1)
firefox (2)
jsunit (1)
mongrel (2)
thin (1)
unicorn (1)
facebook (1)
rubygems (5)
jruby (1)
actioncontroller (1)
rails 2.3 (1)
palmpre (1)
autotest (1)
mac (2)
hosting (1)
goruco (11)
database (3)
railsconf (11)
gogaruco (4)
deployment (4)
github (1)
ie (1)
ajax (1)
intellij (1)
json (1)
asset packaging (1)
polonium (1)
character encoding (1)
utf-8 (1)
test (3)
civics (1)
hpricot (1)
rake (3)
sms (1)
unicode (1)
iphone (1)
java (1)
safari (1)
memory leaks (1)
rr (3)
editor (1)
css (1)
nyc (3)
performance (5)
fun (5)
enterprise rails (1)
health (1)
new and cool (1)
general (2)
treetop (1)
errors (1)
stack (1)
trace (1)
cache (1)
cookies (1)
freesoftware (1)
conferences (1)
development (1)
driven (1)
proxy (1)
caching (1)
peertopatent (1)
languages (1)
rest (2)
rubyforge (1)
sake (1)
file (1)
upload (1)
constants (1)
osx (1)
terminal (1)
pairprogramming (2)
  • About
  • Case Studies
  • Team
  • Community
  • Careers
  • Contact
  • Labs
  • Events

Contact Us

contact@pivotallabs.com
+1 415-77-PIVOT
TwitterLinkedInFacebook

Pivotal Tracker

Tracker is the award-winning agile project management tool that enables real-time collaboration around a shared, prioritized backlog.
Visit pivotaltracker.com >