2016-06-22 69 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

相關問題