2013-09-24 17 views
19

Cerco di creare un modulo modello annidato per l'associazione has_one. (Sto usando Rails 4)Impossibile aggiornare il modulo del modello nidificato per l'associazione has_one

Nel mio utente, e il modello indirizzo Ho il seguente:

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

class Address < ActiveRecord::Base 
belongs_to :user 

end 

mio controller utente:

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 

finalmente a mio avviso ho:

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

Quando provo a riempire la strada archiviata per la prima volta funziona, ma quando provo a aggiornare e ho ricevuto l'errore: Failed to remove the existing associated address. The record failed to save after its foreign key was set to nil

qualsiasi idea di dove si trova l'errore? grazie

risposta

20

nel controller UsersController, nel metodo update, aggiungere il address: :id all'indirizzo permesso attributi. Come questo:

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

funziona funziona grazie tu, questo è quello che cerco: D ma puoi spiegare di più quale è stata la causa del mio errore qui – medBo

+0

puoi spiegarmi di più perché dovrei aggiungere id al mio indirizzo_attributi per favore – medBo

+0

@medBo non so perché devi includere il: id per gli attributi nidificati che devi aggiornare. non è particolarmente documentato e ho avuto esattamente lo stesso problema un paio di mesi fa, lottando per un week-end prima di trovare la soluzione. forse uno sviluppatore senior/esperto di Rails può aiutarti. felice di essere stato utile ;-) – d34n5

0

Questo errore indica in genere che esiste un record per la relazione has_one. In altre parole, questo particolare oggetto user ha già un record address associato. Questo potrebbe accadere durante il test del modulo nel browser.

In questo caso, sembra che Rails stia cercando di creare un nuovo record di indirizzo, e ha a che fare con come è stata scritta l'azione edit.

Prova questa:

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

ma cerco di aggiornare le informazioni non creare un nuovo record !! – medBo

+0

sembra che tu dica che se l'utente ha già un indirizzo, non può aggiornarlo ... – medBo

+0

Prova il mio codice aggiornato. – Mohamad

28

C'è un'opzione per fargli fare un aggiornamento parziale se il record esiste già:

accepts_nested_attributes_for(:address, update_only: true) 

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

+0

good catch lo proverò più tardi, prima che abbia bisogno di aggiungere l'id degli attributi annidati, ora la documentazione è più chiara su questo punto grazie @micaeked – medBo

+1

man, ho provato con tutte le risposte relative ai moduli ideati e nidificati, tu ' l'unica persona con una risposta chiara e semplice e la migliore, ha funzionato !!! grazie mille, ho provato duramente (14 ore) fino a farlo! – pmargreff

Problemi correlati