Подтвердить что ты не робот

Невозможно обновить форму вложенной модели для ассоциации has_one

Я пытаюсь создать вложенную модельную форму для ассоциации 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

любая идея, где ошибка? благодарственные-х

4b9b3361

Ответ 1

в вашем контроллере UsersController, в методе update добавьте address: :id к допустимым адресам. Вот так:

params.require(:user).permit(:user_name, address_attributes: [:id, :street]))

Ответ 3

Эта ошибка обычно указывает, что существует существующая запись для отношения has_one. Другими словами, этот конкретный объект user уже имеет связанную с ним запись address. Это может произойти при проверке формы в браузере.

В этом случае кажется, что Rails пытается создать новую запись адреса, и это связано с тем, как написано ваше действие edit.

Попробуйте следующее:

def edit
  @user = User.find(params[:id]) 
  @address = user.address || @user.build_address
end