Rails 是否允许对 validates_associated 进行条件验证?
Does Rails allow conditional validations for validates_associated?
Rails 是否允许对 validates_associated 进行条件验证?我在 Rails 4.2.0 上看到以下内容。我是不是做错了?
型号:
class User < ActiveRecord::Base
has_many :books
validates_associated :books, if: :should_validate_book?
def should_validate_book?
return false
end
end
class Book < ActiveRecord::Base
belongs_to :user
validates_presence_of :title
end
图书标题属性的存在验证仍在运行(Rails 控制台):
> u = User.create!
=> #<User id: 2, created_at: "2015-02-24 19:34:51", updated_at: "2015-02-24 19:34:51">
> u.books.build
=> #<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>
> u.valid?
=> false
> u.books.first.errors
=> #<ActiveModel::Errors:0x007fa256b210d8 @base=#<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}>
原来 validates_associated 对于 has_many
关系默认是开启的。要有条件地进行,您需要将 validate: false 添加到 has_many 声明中:
has_many :books, validate: false
在Rails自古以来validates_associated
只取得了a list的属性。除此之外,根据我从您粘贴的标准中收集的内容,您可能会混淆模型之间的行为。更好的方法是调整 Book
模型中的验证以考虑变化,让 Book
自行决定是否应验证对象。
Rails 是否允许对 validates_associated 进行条件验证?我在 Rails 4.2.0 上看到以下内容。我是不是做错了?
型号:
class User < ActiveRecord::Base
has_many :books
validates_associated :books, if: :should_validate_book?
def should_validate_book?
return false
end
end
class Book < ActiveRecord::Base
belongs_to :user
validates_presence_of :title
end
图书标题属性的存在验证仍在运行(Rails 控制台):
> u = User.create!
=> #<User id: 2, created_at: "2015-02-24 19:34:51", updated_at: "2015-02-24 19:34:51">
> u.books.build
=> #<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>
> u.valid?
=> false
> u.books.first.errors
=> #<ActiveModel::Errors:0x007fa256b210d8 @base=#<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}>
原来 validates_associated 对于 has_many
关系默认是开启的。要有条件地进行,您需要将 validate: false 添加到 has_many 声明中:
has_many :books, validate: false
在Rails自古以来validates_associated
只取得了a list的属性。除此之外,根据我从您粘贴的标准中收集的内容,您可能会混淆模型之间的行为。更好的方法是调整 Book
模型中的验证以考虑变化,让 Book
自行决定是否应验证对象。