2016-06-22 70 views
0

所以我基本上有一张发票,post_status是零,当它设置为关闭时,用户不能再编辑它。在验证之前,rails将记录保存到表中?

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

这就是我,但是当我设置为关闭的时候,就已经开始验证它,所以我真的不能把它设置为关闭状态。我希望它能够将我的post_status设置为关闭状态,然后在下一次我想要编辑时,我不能编辑它,因为它已经关闭了。

回答

0

我认为这会对你有用。它使用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 
+0

它给我的错误,它说需要提供中只会验证至少一个验证 – Oscar

+0

取出秒,但,当我将它设置为关闭,验证开始踢在已其中犯规让我将其设置为关闭。因为它已经检测到,所以表格将不会被保存为关闭 – Oscar

+0

谢谢你指出。我更新了答案 –

-1

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

0

这都是因为验证正在调用您的更新操作。因此,如果没有任何验证呼叫,您可以设置status = 'Closed'

为此,您可以使用update_column(name, value)。 update_column不会触发任何回调,并且您完成了。

当你在你的控制器中更新列到closed使用像下面一样,你就完成了。

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

如果你从表格中获得价值,你会怎么做?我如何通过? @ object_to_close.update_column(post_status:*这里放什么*如果值来自表单?) – Oscar

+0

我想通了。谢谢,这是更好的方式。 – Oscar

相关问题