rails 在验证之前将记录保存到 table?

rails save record to table before validating?

所以我基本上有一张发票,post_status 为零,当它设置为关闭时,用户无法再编辑它。

validate :post_status, :if => :opened?
def opened?
    if (post_status == 'Closed')
        errors.add(:base, "Already Closed")
        return false
    end
    return true
end

这就是我所拥有的,但是当我设置为关闭时,它已经开始验证它,所以我无法真正将其设置为关闭。我希望它能够将我的 post_status 设置为关闭,这样下次我想编辑时,我就不能再编辑了,因为它已经关闭了。

我认为这对你有用。它使用 validate 允许您根据方法进行验证。

validate :opened_post_status

def opened_post_status
  saved_post_status = self.class.find(id).post_status

  if (saved_post_status == 'Closed')
    errors.add(:base, "Already Closed")
    false
  else
    true
  end  
end

您可以使用更新前的值 post_status_was 来验证 Invoice 模型。

这都是因为验证正在调用您的更新操作。所以你最好在没有任何验证调用的情况下设置 status = 'Closed'

为此你可以使用 update_column(name, value) 。 update_column 没有触发任何回调,你就完成了。

当您在控制器中将列更新为 closed 时,请像下面那样使用,您就完成了。

@object_to_close.update_column('status', 'Closed')