2013-09-24 4 views
19

Ich versuche, ein verschachteltes Modellformular für die Assoziation has_one zu erstellen. (Ich verwende Rails 4)Ich kann mein verschachteltes Modellformular für has_one nicht aktualisieren

In meinem Benutzer und Adresse Modell ich habe folgendes:

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

class Address < ActiveRecord::Base 
belongs_to :user 

end 

meinen Benutzer Controller:

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 

endlich in meiner Sicht, ich habe:

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

Wenn ich versuche, Straße eingereicht zum ersten Mal funktioniert es, aber wenn ich versuche, updat e ich bekomme den fehler: Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

eine idee wo ist der fehler? Danke

Antwort

20

in Ihrem Controller UsersController im update Methode, die address: :id hinzufügen die Adresse Attribute zulässig. Wie folgt aus:

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

woow es funktioniert danke Sie, das ist, was ich suche: D aber können Sie mehr erklärt, was die Ursache für meinen Fehler hier war – medBo

+0

können Sie mir mehr erklären, warum ich ID zu meinem address_attributes bitte hinzufügen sollte – medBo

+0

@medBo ich weiß nicht, warum Sie einbeziehen müssen Die ID zu den verschachtelten Attributen, die Sie aktualisieren müssen. es ist nicht besonders dokumentiert und ich hatte genau das gleiche Problem vor ein paar Monaten, kämpft über ein Wochenende vor der Suche nach der Lösung. Vielleicht kann ein erfahrener Rails-Entwickler helfen. glücklich gewesen zu sein hilfreich gewesen ;-) – d34n5

0

Dieser Fehler zeigt normalerweise an, dass es einen bestehenden Datensatz für die has_one-Beziehung gibt. Mit anderen Worten, dieses spezielle user Objekt hat bereits einen address Datensatz damit verbunden. Dies könnte beim Testen des Formulars im Browser passieren.

In diesem Fall scheint es, als ob Rails versucht, einen neuen Adressdatensatz zu erstellen, und es hat damit zu tun, wie Ihre edit Aktion geschrieben wird.

Versuchen Sie folgendes:

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

aber ich versuche, Informationen zu aktualisieren, nicht zu schaffen ein neuer Rekord !! – medBo

+0

es scheint wie Sie sagen, dass, wenn Benutzer bereits eine Adresse hat, kann er nicht aktualisieren ... – medBo

+0

Versuchen Sie meinen aktualisierten Code. – Mohamad

28

Es gibt eine Option, um es eine teilweise Aktualisierung tun, wenn der Datensatz bereits vorhanden ist:

accepts_nested_attributes_for(:address, update_only: true) 

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

+0

guten Fang ich werde es später versuchen, bevor es die ID der verschachtelten Attribute hinzufügen muss, jetzt Dokumentation ist klarer über diesen Punkt danke @micaeked – medBo

+1

Mann, ich versuchte mit allen Antworten im Zusammenhang mit Geräte und verschachtelten Formen, Sie ' Re der einzige Mensch mit einer klaren, einfachen Antwort und dem Besten, ES ARBEITET !!! Vielen Dank, ich habe mich (14 Stunden) bemüht, bis dahin! – pmargreff

Verwandte Themen