2012-07-17 37 views
2

我已經有一個布爾模型稱爲draft軌道3驗證基於在場的關布爾

我想驗證字段只有draft == false的存在。

我的模型

if self.draft == false 
    validates :name, :presence => true, :length => { :maximum => 45 } 
    validates :description, :presence => true 
    validates :blurb, :presence => true, :length => { :maximum => 175 } 
    validates :category_id, :presence => true 
    validates :location_id, :presence => true 
    validates :goal, :presence => true 
else 
end 

在我的控制器

def new 
    @item.new(:draft => false) || @item.new(:draft => true) 

def create 
    if params[:commit] == "Create Item" 
    @cause = Item.new(params[:item], :draft => false) 
    elsif params[:commit] == "Save Changes" 
    @cause = Item.new(params[:item], :draft => true) 
    end 

它完全忽略了我的if語句和反正驗證它是否是真的還是假的在點擊Save Changes

建議將不勝感激。

回答

7

有條件驗證看起來像下面

validates :name, :presence => true, :length => { :maximum => 45 }, :if => :draft_is_false? 

private 
def draft_is_false? 
    draft == false 
end 

同樣,你可以在其他領域進行有條件的驗證和這些可以歸爲好。閱讀Ruby on Rails指南中的Conditional Validations部分。

+0

你先生太棒了! – kaigth 2012-07-17 19:25:21

+0

有一個upvote。 :-) – johnnygoodman 2013-07-25 01:57:01

+0

條件驗證鏈接已死亡。 :( – DDDD 2013-12-10 23:27:54

0

這是在新的軌道語法一個襯墊:

validates :name, presence: true, length: { maximum: 45 }, if: -> (item) { item.draft? } 

注意到有一個屬性草案後一個問號。 Rails自動爲模型上的所有屬性創建類似draft?的方法,並且基本上是attr.present?的快捷方式。與布爾屬性一起使用時,它表明開發人員的意圖是檢查true/false。