24

has_one 関連付けのネストされたモデル フォームを作成しようとしています。(私はRails 4を使用しています)

私のユーザーとアドレスモデルには、次のものがあります。

class User < ActiveRecord::Base
 has_one :address
 accepts_nested_attributes_for :address
end

class Address < ActiveRecord::Base
 belongs_to :user

end

私のユーザーコントローラー:

class UsersController < ApplicationController
    .
    .
    .
    def edit
      @user = User.find(params[:id]) 
      @user.build_address if @user.address.nil?
    end 

    def update
      @user = User.find(params[:id])
      if @user.update(params.require(:user).permit(:user_name, address_attributes: [:street]))
        flash[:success] = "Profile updated successfully"
        sign_in @user
        redirect_to @user
      else
         flash.now[:error] = "Cannot updating your profile"
         render 'edit'
      end
    end
end

最後に私の見解では、私は持っています:

= form_for(@user) do |f|
  = render 'shared/error_messages', object: f.object
  %div
    = f.label :user_name, "User name"
    = f.text_field :user_name
    = f.fields_for :address do |add|
      = addd.label :street
      = d.text_field :street
    = f.submit "Update"

初めてストリートフィールドに入力しようとすると機能しますが、更新しようとするとエラーが発生します:Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

エラーはどこにありますか?ありがとう

4

3 に答える 3

0

このエラーは通常、has_oneリレーションシップの既存のレコードがあることを示しています。つまり、この特定のuserオブジェクトには、address関連付けられたレコードが既に存在します。これは、ブラウザでフォームをテストしているときに発生する可能性があります。

この場合、Rails が新しいアドレス レコードを作成しようとしているように見えますが、これはeditアクションの記述方法に関係しています。

これを試して:

def edit
  @user = User.find(params[:id]) 
  @address = user.address || @user.build_address
end 
于 2013-09-24T14:17:50.260 に答える