如何防止保存嵌套对象但仍保存主对象?

时间:2016-05-25 17:37:11

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有一个'notes'对象嵌套在多个其他对象中,例如'user'。我想只在有人填写了note_text字段中的内容时添加/保存新笔记。我以为我找到了一种方法,但由于错误,它也会停止保存对象的其余部分。

class User < ActiveRecord::Base
  has_many :notes

  accepts_nested_attributes_for :notes

end  

class Note < ActiveRecord::Base
  belongs_to :user

  before_save :check_for_blank_note

  def check_for_blank_note
    if self.note_text.nil? || self.note_text.blank?
      false
    else
      true
    end
  end
end

我希望停止对笔记的保存并让用户进行更新和保存。

2 个答案:

答案 0 :(得分:3)

使用:reject_if以静默方式删除任何未通过逻辑的记录:

class User < ActiveRecord::Base
  has_many :notes
  accepts_nested_attributes_for :notes, reject_if: proc { |attributes| attributes['note_text'].blank? }
end

答案 1 :(得分:1)

您始终可以添加一项验证,以阻止保存空白笔记:

class Note < ActiveRecord::Base
  validates :note_text, presence: true
end

如果您使用save!,这将触发保存例外,因此您可能希望屏蔽掉任何无效的注释:

before_save :remove_empty_notes

def remove_empty_notes
  self.notes.reject! { |note| !note.valid? }
end