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

それは私にエラーを与え、それはあなたが検証しにSを取り出す少なくとも一つの検証 – Oscar

+0

を供給する必要があるが、私はクローズにそれを設定すると、検証は私がそれを設定することができますdoesntのどの既に蹴る始まりと言いますまったく閉じます。それはすでにそれを検出しているので、テーブルは閉じられたままで保存されません。 – Oscar

+0

それを指摘してくれてありがとう。私は答えを更新しました –

-1

あなたはInvoiceモデルを検証するために、更新前の値である、post_status_wasを使用することができます。

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

関連する問題