Rails:防止创建父模型并显示子模型验证错误

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)

任何线索或见解都非常感谢!

inf*_*sed 5

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)