2013-11-21 12 views
25

Ho letto e ricercato da circa 3 giorni. Questa è la mia ultima risorsa.accept_nested_attributes_for rails 4 non sta cancellando

land.rb:

has_many :uploads , :dependent => :destroy 
accepts_nested_attributes_for :uploads, :allow_destroy => true,:reject_if => :all_blank 

upload.rb

belongs_to :land 

_land_form_partial.html.erb

<%= form_for land , :html => {:multipart => true} do |f| %> 

    <%= f.fields_for :uploads do |builder| %> 
     <div class="land_fields"> 
      <%= builder.label :filename, "Image" %> 
      <%= builder.text_field :filename %> <br/> 
      Delete: <%= builder.check_box :_destroy %> 
     </div> 
    <% end %> 
#... buttons and other fields 
<% end %> 

lands_controller.rb

def update 
    if @land.update_attributes(land_params) 
     flash[:success] = "Land updated" 
     redirect_to lands_path 
    else 
     flash[:alert] = @land.errors.full_messages.first 
     redirect_to edit_land_path 
    end 
    end 

def land_params 
    params.require(:land).permit(uploads_attributes: [ :id, :filename ] ) 
    end 

Quando aggiungo qualcosa al campo di testo e lo aggiorno, tutti gli aggiornamenti sono corretti. Se clicco sulla casella non rimuoverà il campo.

Qualcuno può per favore far luce su questo?

Anche io ho provato awesome_nested_fields ma tutto funziona, tranne che per rimuovere il record attuale.

grazie in anticipo.

EDIT: Soluzione: (mi piace mettere la soluzione in questione nel caso in cui qualcuno vuole vederlo sul cellulare come io odio quando non riesco a vedere la soluzione subito)

Grazie a @nTraum

def land_params 
    params.require(:land).permit(uploads_attributes: [ :id, :filename, :_destroy ] ) 
end 

E tutto sarà da dandy :)

+1

Ho avuto lo stesso problema ma nel mio caso ho omesso il campo: id. Quindi, se si desidera eliminare un modello annidato, è necessario consentire: id e: _detroy attributi del modello annidato. –

risposta

46

È necessario consentire il parametro :_destroy per il modello nidificato pure, come questo viene utilizzato quando si seleziona la casella di controllo 'Elimina' nella forma. È il modo in cui Rails indica le istanze del modello che devono essere distrutte.

def land_params 
    params.require(:land).permit(uploads_attributes: [:id, :filename, :_destroy]) 
end 
+1

Penso che sia un pasticcio se dico che TI AMO UOMO. Era maledettamente vero. Grazie ancora :). –

+6

Solo una nota sia i parametri: id che: _destroy sono necessari, l'ho scoperto dopo aver aggiunto solo: destory – Eric

+0

Grazie mille per @nTraum – Shiko

6

Il PO non ha avuto lo stesso problema come me, ma per chiunque imbattersi in questa domanda, per me, era l'assenza di allow_destroy: true come argomento sulla accepts_nested_attributes chiamata nel modello.

+0

questo dovrebbe essere evidenziato nella documentazione meglio – retroGiant

Problemi correlati