geo*_*boy 13 validation activerecord ruby-on-rails
我一直坚持这个问题,并且已经彻底混淆了嵌套模型和验证如何协同工作.
在下面的代码中,我的目标是,如果子模型(内容)的验证失败,则父模型(图像或视频)的创建将失败.目前,父模型正在保存,而子模型则没有,并且验证错误是闻所未闻的.如果没有验证错误,那么一切都按预期工作.
#Image.rb
has_one :content,
as: :contentable,
inverse_of: :contentable,
dependent: :destroy
#Video.rb
has_one :content,
as: :contentable,
inverse_of: :contentable,
dependent: :destroy
#Content.rb
belongs_to :contentable,
inverse_of: :content,
polymorphic: true
validate :all_good?
def all_good?
errors.add(:base, "Nope!")
return false
end
Run Code Online (Sandbox Code Playgroud)
任何线索或见解都非常感谢!
Rails有一个名为validates_associated的特殊验证,可确保关联的记录有效.如果关联的记录无效,则父记录也将无效,并且关联的错误将添加到其错误列表中.
在您的图像和视频类中添加以下内容:
validates_associated :content
Run Code Online (Sandbox Code Playgroud)
现在,如果content关联无效,则不会保存视频或图像.
video = Video.new
video.content = Content.new
video.save #=> false
video.valid? #=> false
video.errors #=> [:content => "is invalid"]
Run Code Online (Sandbox Code Playgroud)
小智 0
您需要在自定义验证中引发异常。做类似的事情
before_save :ensure_all_good
def ensure_all_good
try saving stuff to chile
failed? raise nope
end
Run Code Online (Sandbox Code Playgroud)