2013-09-24 14 views
19

Próbuję utworzyć zagnieżdżony formularz modelu dla powiązania has_one. (Używam Rails 4)Nie można zaktualizować mojego modelu zagnieżdżonego dla skojarzenia has_one

W moim użytkownika i adres Model Mam następujący:

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

class Address < ActiveRecord::Base 
belongs_to :user 

end 

mój kontroler użytkownika:

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 

wreszcie moim zdaniem mam:

= 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" 

Kiedy próbuję wypełnić ulicę po raz pierwszy, działa, ale gdy próbuję wykonać aktualizację e pojawia się błąd: Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

Jakiś pomysł, gdzie jest błąd? thank's

Odpowiedz

20

w kontrolerze UsersController w sposobie update dodaj address: :id na adres dozwolone atrybuty. Tak:

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

woow to dziękuję ty, to jest to, co szukam: D, ale czy możesz wyjaśnić więcej, co było przyczyną mojego błędu tutaj? – medBo

+0

czy możesz mi wyjaśnić, dlaczego powinienem dodać id do mojego address_attributes please – medBo

+0

@medBo Nie wiem, dlaczego musisz uwzględnić the: id do zagnieżdżonych atrybutów, które musisz zaktualizować. Nie jest to szczególnie udokumentowane i miałem dokładnie ten sam problem kilka miesięcy temu, walcząc przez tydzień przed znalezieniem rozwiązania. może bardziej zaawansowany/ekspert programista Rails może pomóc. szczęśliwy, że był pomocny ;-) – d34n5

0

Ten błąd zwykle oznacza, że ​​istnieje rekord dla relacji has_one. Innymi słowy, ten konkretny obiekt user ma już powiązany z nim zapis address. Może się to zdarzyć podczas testowania formularza w przeglądarce.

W tym przypadku wygląda na to, że Rails próbuje utworzyć nowy rekord adresu i ma związek ze sposobem, w jaki jest zapisywane działanie użytkownika edit.

Spróbuj tego:

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

ale staram się aktualizować informacje nie tworzyć nowa płyta !! – medBo

+0

Wygląda na to, że mówisz, że jeśli użytkownik ma już adres, nie może go zaktualizować ... – medBo

+0

Wypróbuj mój zaktualizowany kod. – Mohamad

28

Istnieje możliwość, aby to zrobić częściową aktualizację jeśli rekord już istnieje:

accepts_nested_attributes_for(:address, update_only: true) 

udokumentowane tutaj: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#method-i-accepts_nested_attributes_for

+0

dobry połów, spróbuj go później, zanim będzie trzeba dodać identyfikator zagnieżdżonych atrybutów, teraz dokumentacja jest bardziej zrozumiała na ten temat dziękuję @micaeked – medBo

+1

człowiek, próbowałem z wszystkimi odpowiedziami związanymi z tworzeniem i zagnieżdżonymi formularzami, ty ' to jedyna osoba z jasną, prostą odpowiedzią i najlepsza, TO DZIAŁA !!! dziękuję bardzo, próbowałem mocno (14 godzin), aż to zrobię! – pmargreff

Powiązane problemy