duplicates - recursos - Los atributos anidados de RoR producen duplicados cuando se editan
recursos anidados rails (2)
Así que lo descubrí. Tuve que agregar :id
a los parámetros permitidos en el método survey_params
. Ahora se ve así:
# Never trust parameters from the scary internet, only allow the white list through.
def survey_params
params.require(:survey).permit(:name, questions_attributes: [:id, :content])
end
que funciona a la perfección Soy un novato de RoR, así que por favor analice esto con un grano de sal, pero supongo que los nuevos identificadores se generaron en lugar de pasarse a la acción de actualización. Espero que esto ayude a alguien más allá.
Intento seguir a Ryan Bates RailsCast # 196: Formulario de modelo anidado parte 1 . Hay dos diferencias aparentes con la versión de Ryans: 1) Estoy usando andamios incorporados y no es ingenioso mientras está usando, y 2) Estoy utilizando raíles 4 (realmente no sé qué versión usa Ryans en su reparto) , pero no es 4).
Así que esto es lo que hice
rails new survey2
cd survey2
bundle install
rails generate scaffold survey name:string
rake db:migrate
rails generate model question survey_id:integer content:text
rake db:migrate
Luego agregué las asociaciones a los modelos como tal
class Question < ActiveRecord::Base
belongs_to :survey
end
y entonces
class Survey < ActiveRecord::Base
has_many :questions
accepts_nested_attributes_for :questions
end
Luego agregué la parte de vista anidada
<%= form_for(@survey) do |f| %>
<!-- Standard rails 4 view stuff -->
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.fields_for :questions do |builder| %>
<div>
<%= builder.label :content, "Question" %><br/>
<%= builder.text_area :content, :rows => 3 %>
</div>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
y finalmente el controlador para que se creen 3 preguntas siempre que se cree una nueva encuesta
class SurveysController < ApplicationController
before_action :set_survey, only: [:show, :edit, :update, :destroy]
# Standard rails 4 index and show
# GET /surveys/new
def new
@survey = Survey.new
3.times { @survey.questions.build }
Rails.logger.debug("New method executed")
end
# GET /surveys/1/edit
def edit
end
# Standard rails 4 create
# PATCH/PUT /surveys/1
# PATCH/PUT /surveys/1.json
def update
respond_to do |format|
if @survey.update(survey_params)
format.html { redirect_to @survey, notice: ''Survey was successfully updated.'' }
format.json { head :no_content }
else
format.html { render action: ''edit'' }
format.json { render json: @survey.errors, status: :unprocessable_entity }
end
end
end
# Standard rails 4 destroy
private
# Use callbacks to share common setup or constraints between actions.
def set_survey
@survey = Survey.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def survey_params
params.require(:survey).permit(:name, questions_attributes: [:content])
end
end
Entonces, crear una nueva encuesta con tres preguntas está bien. Sin embargo, si intento editar una de las encuestas, se mantienen las tres preguntas originales, mientras que se crean otras tres más. Entonces, en lugar de tener 3 preguntas para la encuesta editada, ahora tengo 6. Agregué
Rails.logger.debug("New method executed")
al nuevo método en el controlador, y hasta donde sé, no se ejecuta cuando estoy haciendo una operación de edición. ¿Alguien puede decirme lo que estoy haciendo mal?
¡Cualquier ayuda es muy apreciada!
Usando cocoon
Gema en Rails 4, todavía recibía campos duplicados incluso después de agregar :id
a la lista permitida al editar. También noté lo siguiente
Unpermitted parameters: _destroy
Unpermitted parameters: _destroy
Así que agregué el campo :_destroy
campo permitido model_attributes:
y las cosas funcionaron sin problemas después de eso.
Por ejemplo...
def survey_params
params.require(:survey).permit(:name, questions_attributes: [:id, :content, :_destroy])
end