Rails 4 supprimant les attributs imbriqués, fonctionne sur créer mais pas sur modifier / mettre à jour

Donc je suis en train de travailler à partir de ce Railscast.

Et je suis conscient qu'il y a eu quelques changements dans les Rails 4 pour des paramètres de poids.

Première question.

Deuxième question pertinente

J'ai quadruple vérifié mon application, mais ne peut pas voir où je vais mal. Comme il est à l'heure actuelle, en cochant la case "détruire" la boîte au moment de soumettre le patient à l'origine (c'est à dire la méthode create) fonctionne comme prévu, et va supprimer tout médicament qui a une case est cochée et permettant à tout un qui n'a pas (à partir de trois entrées d'un formulaire qu'il fournit).

Cependant lorsque je l'ai par la suite modifier ce patient, les médicaments que ne pas obtenir vérifié pour être supprimés sont en double (donc je me retrouve avec plus de médicaments que j'ai commencé avec), et qui sont vérifiées pour la suppression ne semble pas changer.

Donc si il y a deux médicaments attaché "Med1" et "Med2", et j'ai modifier le patient, si les deux sont marqués pour la suppression, je vais toujours jusqu'à la fin avec "Med1" et "Med2". Si seulement "Med1" est marqué pour suppression je vais finir avec "Med1" et "Med2" et d'un "Med2". Si ni est marqué pour la suppression je vais finir avec deux de chaque "Med1" et "Med2".

#patient.rb
class Patient < ActiveRecord::Base
has_many :procedures
has_many :medications, dependent: :destroy
has_many :previous_operations, dependent: :destroy

accepts_nested_attributes_for :medications, :allow_destroy => true, :reject_if => lambda { |a| a[:name].blank? },
end

#views/patients/_form.html.erb
<%= form_for(@patient) do |f| %>
  <% if @patient.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@patient.errors.count, "error") %> prohibited this patient from being saved:</h2>

      <ul>
      <% @patient.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%= f.fields_for :medications do |builder| %>
    <%= render "medication_fields", :f => builder %>
  <% end %>

  <div class="field">
    <%= f.label :first_name %><br>
    <%= f.text_field :first_name %>
  </div>
  <div class="field">
    <%= f.label :last_name %><br>
    <%= f.text_field :last_name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

#views/patients/medications_fields.html
<div class="field">
  <%= f.label :name %><br>
  <%= f.text_field :name %>
</div>
<div class="field">
  <%= f.label :_destroy, "Remove Medication" %>
  <%= f.check_box :_destroy %>
</div>

#controllers/patients_controller.rb
class PatientsController < ApplicationController
before_action :set_patient, only: [:show, :edit, :update, :destroy]
# GET /patients
# GET /patients.json
def index
@patients = Patient.all
end
# GET /patients/1
# GET /patients/1.json
def show
end
# GET /patients/new
def new
@patient = Patient.new
3.times { @patient.medications.build }
end
# GET /patients/1/edit
def edit
end
# POST /patients
# POST /patients.json
def create
@patient = Patient.new(patient_params)
respond_to do |format|
if @patient.save
format.html { redirect_to @patient, notice: 'Patient was successfully created.' }
format.json { render action: 'show', status: :created, location: @patient }
else
format.html { render action: 'new' }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /patients/1
# PATCH/PUT /patients/1.json
def update
respond_to do |format|
if @patient.update(patient_params)
format.html { redirect_to @patient, notice: 'Patient was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @patient.errors, status: :unprocessable_entity }
end
end
end
# DELETE /patients/1
# DELETE /patients/1.json
def destroy
@patient.destroy
respond_to do |format|
format.html { redirect_to patients_url }
format.json { head :no_content }
end
flash[:notice] = "Patient was successfully deleted."
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def patient_params
params.require(:patient).permit(:first_name, :last_name, medications_attributes: [:name, :_destroy])
end
end

J'ai été super attentive et vérifié plus d'un million de fois :_destroy drapeau a été autorisé par le biais des paramètres de poids, mais toujours pas de dés.

Toute aide appréciée, doit être quelque chose d'évident que je ne peux pas voir.

MODIFIER

La modification de cette...

    # Never trust parameters from the scary internet, only allow the white list through.
def patient_params
params.require(:patient).permit(:first_name, :last_name, medications_attributes: [:name, :_destroy])
end

...

    # Never trust parameters from the scary internet, only allow the white list through.
def patient_params
params.require(:patient).permit!
end

semble fonctionner correctement, donc je suis sûr que c'est quelque chose à faire avec des paramètres de poids, mais ce dernier est moins sûr, je suis sûr, et pas de la meilleure pratique.

source d'informationauteur user2792268