How to make sure that the child is valid while saving the parent?

let's say that I have two classes

class User
  attr_accessible :name

  has_one :address

  validates :name, :presence => true
  validates_associated :address
end

class Address
  attr_accessible :country, :user_id

  belongs_to :user

  validates :country, :presence => true
  validates :user, :presence => true
end

Now when I try to create an invalid Addressthen it fails (which is good)

a = Address.new
a.valid?  #=> false

But when I build User with an invalid Address, then it passes (which is bad)

u = User.first
u.build_address

u.valid?  #=> true
u.save    #=> true

In this regard, it Userhas Addresswith country => nil.

How can I tell Rails not to save Addressif its invalid?

FIXED: I fixed this by adding a line to the code. Thanks to everyone.

validates_associated :address, :if => :address
+1
source share
2 answers
class User
  attr_accessible :name

  has_one :address, :validate => true

  validates :name, :presence => true
  validates_associated :address

end

+1
source

You also need to check that Addressthere is User:

class User < ActiveRecord::Base
  validates :address, :associated => true, :presence => true
end

With this I get:

>> u = User.first
=> #<User id: 1, name: "Bob", created_at: "2013-10-09 15:17:21", updated_at: "2013-10-09 15:17:21">
>> u.build_address
=> #<Address id: nil, user_id: 1, country: nil, created_at: nil, updated_at: nil>
>> u.valid?
=> false
>> u.errors
=> #<ActiveModel::Errors:0x007fe1d6919b18 @base=#<User id: 1, name: "Bob", created_at: "2013-10-09 15:17:21", updated_at: "2013-10-09 15:17:21">, @messages={:address=>["is invalid"]}>
>> u.address.errors
=> #<ActiveModel::Errors:0x007fe1d69197a8 @base=#<Address id: nil, user_id: 1, country: nil, created_at: nil, updated_at: nil>, @messages={:country=>["can't be blank"]}>
0

Source: https://habr.com/ru/post/1544436/


All Articles