tutorial recursos rails programas programacion formularios ejemplos desde cero anidados duplicates ruby-on-rails-4 nested-attributes

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