2011-12-16 34 views
0

衝突我無法將外鍵字段的驗證和使用.build方法創建對象結合起來。見下面的課程。Rails 3.1:通過.build創建對象似乎與validates_presence_of

class Parent < ActiveRecord::Base 
    belongs_to :family 
    has_one :family_user 
    validates_presence_of :name 
    validates_associated :family 
    validates_presence_of :family_id 
end 

class Family < ActiveRecord::Base 
    belongs_to :organization 
    has_many :parents 
    ... 
end 

這通常工作正常,但在應用程序中我想使用構建方法。例如,spec和rails控制檯中的以下代碼失敗,因爲它正在父記錄上查找family_id。

fam = Family.new(:organization_id => 1) 
    fam.children.build(:name => "Billy Jones") 
    fam.parents.build(:name => "Mister Jones") 
    fam.save! 

沒有validates_presence_of :family_id此代碼的工作,並且確實是一個family_id是否正確錄製。

問題:有沒有一種方法來驗證family_id是否確實被記錄,同時也能夠使用.build?

作爲參考,在控制檯中的錯誤是:

ruby-1.9.2-p290 :082 > fam = Family.new(:organization_id => 1) 
=> #<Family id: nil, organization_id: 1, created_at: nil, updated_at: nil, url_token: nil> 
ruby-1.9.2-p290 :083 > fam.children.build(:name => "Billy Jones") 
=> #<Child id: nil, family_id: nil, name: "Billy Jones", gender: nil, birth_date: nil, desired_start_date: nil, application_date: nil, notes: nil, custom1: nil, custom2: nil, custom3: nil, custom4: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :084 > fam.parents.build(:name => "Mister Jones") 
=> #<Parent id: nil, family_id: nil, name: "Mister Jones", address: nil, phone: nil, email: nil, notes: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :085 > fam.save! 
ActiveRecord::RecordInvalid: Validation failed: Parents family can't be blank 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/validations.rb:56:in `save!' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/attribute_methods/dirty.rb:33:in `save!' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:246:in `block in save!' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:208:in `transaction' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:293:in `with_transaction_returning_status' 
    from /Users/business/.rvm/gems/[email protected]/gems/activerecord-3.1.1/lib/active_record/transactions.rb:246:in `save!' 
    from (irb):85 
    from /Users/business/.rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start' 
    from /Users/business/.rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start' 
    from /Users/business/.rvm/gems/[email protected]/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 
ruby-1.9.2-p290 :086 > 

回答

0

我會以同樣的方式理解,至少在最初的讀取你的代碼。

也許你可以試試這個替代的解決方案:

http://forums.pragprog.com/forums/74/topics/732

+0

謝謝。我嘗試過,但它似乎會導致更多問題。似乎解決了`validates_associated`多於`validates_presence_of`的問題。 – 2011-12-16 21:54:03

0

刪除

validates_associated :family 
validates_presence_of :family_id 

,並嘗試這個

validates_presence_of :family 

希望這有助於。

相關問題