1

ユーザーコントローラーでユーザーの写真を作成するための次のコードがあります。

  def new
    @user = User.new
    @pictures = @user.pictures.build({:placement => "front"},{:placement => "profile"})
  end

ただし、新しいユーザーを作成すると、配置が「正面」または「横顔」の写真が自動的に作成されません。実際、写真の更新は一切ありません。写真のモデルは

attr_accessible :placement

そしてpicture.rbで

belongs_to :user

そしてuser.rbで

has_many :pictures
accepts_nested_attributes_for :pictures, allow_destroy: true

ビルド コマンドがサイレントに失敗するのはなぜですか?

アップデート

.save! を使用して@pictures、割り当てられていることを知りましたが、問題はそれらに関連付けられている user_id ではありません。次のように、意図的に user_id を割り当てると、

def new
    @user = User.new
    @pictures = @user.pictures.build({:placement => "front", :user_id => @user.id},{:placement => "profile", :user_id => @user.id})
 end

まだ user_id を割り当てていません。

奇妙なことに、Rails コンソールでまったく同じコマンドを実行すると、user_id が正しく割り当てられます。

@pictures コマンドが実行されるまで、新しい @user に自動 ID が割り当てられないように見えますが、コンソール バージョンは操作を順番に実行しているため成功しています。

そのため、空白の ID が表示されます。

なぜこうなった?そして、この同時ID割り当ては、モデルがbelongs_toand has_many、 andで処理することになっているものではありaccepts_nested_attributes_forませんか?

それらをリンクするIDが保存後まで作成されない場合、ネストされた属性の割り当てに対処する適切な方法は何ですか?

これが機能しないのはなぜですか?

4

2 に答える 2

1

これが問題かどうかはわかりませんが、picture.rbのattr_acessible行に:user_idを追加する必要があります。読み取り/書き込みする属性はattr_accessibleである必要があります。そうでない場合、一括割り当てエラーが発生します。

于 2012-10-08T23:01:19.347 に答える
0

ドキュメントに記載されています。ユーザーIDは、保存後にデータベースによって割り当てられます。したがって、user_id を使用する前に、まずユーザーを保存する必要があります。

:user_id => @user.id を :user => @user に変更すると、Rails はそれらを適切な順序で保存できるため、まだ保存されていないことがわかり、それらの関係を更新する必要があるため、動作するはずです。

于 2012-08-10T08:43:28.113 に答える