1

私のedit行動では、employees_controller次のコード行があります。

#Employee#edit
69: if @employee.user.person.addresses.length == 0
70:   @employee.user.person.addresses << Address.new
71: end

Address編集erbファイルに表示されるように、空白がない場合は空白を追加する必要があります。そうすれば、この従業員に関連付けられているアドレスがなかった場合、このレコードを編集するときにアドレスを追加する必要があります。

このような多対多の関連があります:Person <- User <- Employeeそしてと多Person対多の関係がありAddressます。その宣言は次のようになります。

#class Person
has_many :address_person_links, :dependent => :destroy
has_many :addresses,
  :through => :address_person_links,
  :uniq => true,
  :validate => false, # I thought this would fix it but doesn't
  :dependent => :destroy

コードは次の70行目で失敗しますemployees_controller.rb

/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/validations.rb:1090:in `save_without_dirty!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:87:in `save_without_transactions!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:200:in `save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:182:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:200:in `save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:200:in `save!'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/has_many_through_association.rb:63:in `insert_record'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:119:in `<<'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:433:in `add_record_to_target_with_callbacks'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:118:in `<<'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:116:in `each'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:116:in `<<'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:141:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/transactions.rb:182:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:140:in `transaction'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:115:in `<<'
/home/aaron/NetBeansProjects/onlinescheduler/app/controllers/employees_controller.rb:70:in `edit'

その呼び出しに注意してくださいsave?なぜこれをしているのですか?

4

2 に答える 2

1

これは、ARオブジェクトを連想配列に追加するたびに、オブジェクトを保存し、そのIDを連想テーブルに追加しようとするために発生します(many_to_manyの場合)

次のことを試してみてください

#Employee#edit
69: if @employee.user.person.addresses.length == 0
70:   @employee.user.person.addresses = [Address.new]
71: end

またaccepts_nested_attributes_for、慣例でこれを行う場合は、buildメソッドを使用することです

#Employee#edit
69: if @employee.user.person.addresses.length == 0
70:   @employee.user.person.addresses.build
71: end

詳細については、 http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributesを参照してください。

于 2010-05-09T05:12:45.520 に答える
1

まず、意味を明確にするために、次のように確認することをお勧めします。

if @employee.user.person.addresses.empty?

次に、ログを確認すると、アドレス(および対応するaddress_person_link)が "<<"メソッドによってデータベースに追加されていることがわかります。これにより、検証が呼び出され、保存が失敗します(新しく作成されたアドレスとして)検証しません)。

住所検証を変更して、それが新しく作成されたレコードである場合( "<<"を使用して人に追加した場合など)に実行されないようにすることができます。次のようになります。

validates_presence_of :name, :unless => Proc.new{|a|a.new_record?}

Addressの検証で、すべてに:unlessブロックを追加する必要があります。

于 2010-05-09T05:18:47.043 に答える