29

次のように、ユーザーとネストされたプロファイル クラスがあります。

class User < ActiveRecord::Base
  has_one :profile
  attr_accessible :profile_attributes
  accepts_nested_attributes_for :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user
  attr_accessible :name
end

user = User.find(1)
user.profile.id  # => 1
user.update_attributes(profile_attributes: {name: 'some name'})
user.profile.id  # => 2

Rails が古いプロファイルを破棄して新しいプロファイルを作成する理由がわかりません。

使用する

user.profile.update_attributes({name: 'some name'})

期待どおりに現在のプロファイルを更新するだけです。しかし、その場合、私はaccepts_nested_attributes_forを利用していません

更新がこのように行われる理由を誰かが知っていますか? どのユーザーにも接続されていないプロファイル行のデータベースになってしまうことは避けたいと思います。

4

4 に答える 4

37

Rails 4 で同じ問題を抱えているすべての人のために: fields_for はすでにネストされたフォームの id を追加していますが、:id パラメータを許可する必要があります。:object_name_id パラメーターのみを許可しました。これはエラーをスローしないため、サーバー ログでこれを確認するまでに時間がかかりました。うまくいけば、これは誰かが私よりも時間を無駄にするのに役立ちます:)

于 2013-11-02T13:48:49.033 に答える
24

フォームを確認すると、プロファイル オブジェクトのネストされた属性ハッシュ内に id 属性を設定する必要があります。id が設定されていない場合、ActiveRecord はそれが新しいオブジェクトであると想定します。

たとえば、ユーザー内のネストされたプロファイルのネストされた「profile_attributes」パラメーター ハッシュを使用して一連の「user」パラメーターを構築する ERB フォームがある場合、次のように、プロファイル ID に非表示の値を含めることができます。

<%= hidden_field "user[profile_attributes][id]", @profile.id %>
于 2012-03-30T18:26:06.313 に答える
21

update_onlyオプションを追加してこの問題を解決しました:

accepts_nested_attributes_for :profile, update_only: true

新しいプロファイルは、まだ存在しない場合にのみ作成されるようになりました。

于 2012-04-04T14:16:30.903 に答える
0

私は Rails の別のバージョンでこれに見舞われ、頭がおかしくなると思いました。update_only => true を追加すると解決しましたが、Rails のどこかのバグだと思います。

私の場合の症状:最初にページを更新するまで、属している削除された新しいネストされたオブジェクトへの関連付けを取得します。その後、正常に動作しました。

私の場合、入れ子になったクラスに before_save メソッドを追加し、保存されたものを出力しました。update_attributes を呼び出す前に、属性も出力しました。「parent_id」が正しく設定されていました。また、非表示の id フィールドをフォームに含めましたが、変更はありません - fields_for を使用して既に含まれているため、これは正常でした...

驚き: 1 つの更新呼び出しが 2 つの保存呼び出しを生成するのを見ました。最初の保存では、ネストされたオブジェクト ID が含まれますが、belongs_to ID は null になります。- これにより、レコードが更新され、「parent_id」が null に設定されます。2 回目の保存では「parent_id」が設定されますが、ネストされたオブジェクト ID は null に設定されます。

私が言ったように、 update_only => true を追加して修正しましたが、まだバグだと思います。

上記の症状があなたのケースにも当てはまるかどうかを調べて、これがバグであることを確認したいと思います.

于 2016-03-01T16:10:53.337 に答える