2015-02-24 26 views
3

Rails是否允許validates_associated的條件驗證?我在Rails 4.2.0上看到以下內容。我試圖做錯嗎?Rails是否允許validates_associated的條件驗證?

型號:

class User < ActiveRecord::Base 
    has_many :books 

    validates_associated :books, if: :should_validate_book? 

    def should_validate_book? 
    return false 
    end 
end 

class Book < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of :title 
end 

在書的標題屬性的存在驗證仍然運行(Rails的控制檯):

> u = User.create! 
=> #<User id: 2, created_at: "2015-02-24 19:34:51", updated_at: "2015-02-24 19:34:51"> 
> u.books.build 
=> #<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil> 
> u.valid? 
=> false 
> u.books.first.errors 
=> #<ActiveModel::Errors:0x007fa256b210d8 @base=#<Book id: nil, user_id: 3, title: nil, created_at: nil, updated_at: nil>, @messages={:title=>["can't be blank"]}> 

回答

1

事實證明,validates_associated是由默認has_many關係。爲了讓有條件,你需要添加驗證:假到的has_many聲明:

has_many :books, validate: false 
0

在Rails自古以來validates_associated只收了屬性a list。除此之外,根據我們從粘貼的標準中收集的內容,您會在模型之間混淆行爲。更好的方法是在Book模型中調整驗證以解釋變化,並讓Book自行決定是否驗證對象。

+0

問題中的代碼只是我寫的一個簡單的模型,用來說明我看到的使用validates_associated的行爲,所以我仍然認爲validates_associated是一條路。鏈接的頁面顯示方法簽名'validates_associated(* attr_names)public',這意味着它允許單個屬性。我錯過了什麼嗎?謝謝! – Readonly 2015-02-25 00:12:25