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.
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
Vous devez vous connecter pour publier un commentaire.
quand vous faites
il permet à tous de vos attributs et il n'est pas recommandé. C'est plus d'un hack, plutôt que comme une solution.
Si vous regardez votre question
Rails 4 deleting nested attributes, works on create but not on edit/update
et si vous regardez votre params permis
Cela permettra de travailler sur la création d'patients, mais pas sur la mise à jour ou de les éditer car, lorsque vous créez un nouveau record il ne nécessite pas de permis id mais lorsque vous souhaitez mettre à jour ou modifier un enregistrement vous avez besoin de l'id de la être autorisées en tant que bien.
Correctif:
Juste passer le id attribut autorisés attributs et il va travailler pour vous