2011-02-18 136 views
3

我想知道是否有關於自定義操作使用軌驗證的方式自定義驗證。軌道上行動

例如,我想這樣做:

validates_presence_of :description, :on => :publish, :message => "can't be blank" 

我做基本的驗證創建和保存,但也有很多事情我不想要求前面。也就是說,他們應該能夠保存準確的記錄而不驗證所有的字段,但是我有我的控制器和模型中的自定義「發佈」動作和狀態,在使用時應該驗證以確保記錄是100%

上面的例子沒有工作,有什麼想法?

UPDATE:

我的狀態機看起來是這樣的:

include ActiveRecord::Transitions 
    state_machine do 
    state :draft 
    state :active 
    state :offline 

    event :publish do 
     transitions :to => :active, :from => :draft, :on_transition => :do_submit_to_user, :guard => :validates_a_lot? 
    end 

    end 

我發現我可以補充後衛,但我仍然希望能夠使用軌驗證,而不是做這一切的在自定義方法上。

回答

5

這看起來更像是業務邏輯而不是模型驗證了我。我是在一個項目前幾年中,我們曾發表文章,以及大量的業務規則,只是在那一刻執行。

我會建議你做類似Model.publish()和方法應該強制所有的業務規則,以便爲要發佈的項目。

一個選項是運行一個自定義的驗證方法,但可能需要一些字段添加到您的模型。這裏有一個例子 - 我會假設你模型被稱爲文章

Class Article < ActiveRecord::Base 
    validate :ready_to_publish 

    def publish 
    self.published = true 
    //and anything else you need to do in order to mark an article as published 
    end 

    private 
    def ready_to_publish 
    if(published?) 
     //checks that all fields are set 
     errors.add(:description, "enter a description") if self.description.blank? 
    end 
    end 
end 

在這個例子中,客戶端代碼應該調用an_article.publish當被調用article.save它會自動完成剩下的。這種方法的其他的好處是,你的模型將始終是一致的,而不是取決於在其上調用動作。

+0

的變化上這對我有用,但是,我將如何顯示我的show view中的錯誤? – Raoot 2012-09-10 16:51:43

1

如果你的「發佈」動作設置某種狀態字段的「發佈」,那麼你可以這樣做:

validates_presence_of :description, :if => Proc.new { |a| a.state == 'published' } 

或者,如果每個國家都有自己的方法

validates_presence_of :description, :if => Proc.new { |a| a.published? } 
+0

第二個看起來很有希望,但沒有工作。 ;-(我更新了我的問題。 – holden 2011-02-19 09:37:06