ruby-on-rails - many - rails nested attributes through
Rieles anidados has_one: no se puede eliminar el registro existente (2)
Cada vez que se crea un nuevo registro es una especie de sobrecarga. Simplemente tiene que incluir el campo oculto con el ID de registro y se actualizará en lugar de destruirlo
= qo.hidden_field :id
Estoy tratando de actualizar atributos de question_output anidados en un modelo de "pregunta". Una pregunta ha_una pregunta_output. Si no hay question_outputs existentes en la base de datos, todo funciona bien. Pero si el registro ya tiene un question_output, obtengo lo siguiente cuando intento actualizar:
Error al eliminar el question_output asociado existente. El registro no se pudo guardar cuando, después de su clave externa, se estableció en nulo.
Habría pensado que el permiso_destroy se encargaría de eso, pero por desgracia, no hay alegría. Admito que no he usado has_one mucho antes. Pero si alguien tiene alguna idea sobre cómo solucionar este problema, le agradecería. Código relevante a continuación:
La forma:
= form_for [@question.project, @question], :as => :question, :url => admin_project_question_path(@question.project, @question) do |f|
= render ''/shared/form_errors'', :model => @question
= f.fields_for :question_output_attributes do |qo|
.field
= qo.label :question_type
= qo.select :question_type, QuestionOutput::QUESTION_TYPES
.field
= qo.label :client_format
= qo.select :client_format, QuestionOutput::CLIENT_FORMATS
.field
= qo.label :required
= qo.check_box :required
.field
= qo.label :min_input, ''Length''
= qo.text_field :min_length
= qo.text_field :max_length
= f.submit ''Save Question Formatting''
Modelo de pregunta:
class Question < ActiveRecord::Base
has_one :question_output
accepts_nested_attributes_for :question_output, :allow_destroy => true
end
Modelo de QuestionOutput:
class QuestionOutput < ActiveRecord::Base
belongs_to :question
end
Controlador de preguntas:
class Admin::QuestionsController < ApplicationController
def show
@question = Question.find(params[:id])
@question.question_output ||= @question.build_question_output
end
def update
@question = Question.find(params[:id])
if @question.update_attributes(params[:question])
flash[:notice] = t(''models.update.success'', :model => "Question")
redirect_to admin_project_question_path(@question.project, @question)
else
flash[:alert] = t(''models.update.failure'', :model => "Question")
redirect_to admin_project_question_path(@question.project, @question)
end
end
end
En su modelo de pregunta, cambie la línea has_one a:
has_one :question_output, :dependent => :destroy
the :allow_destroy => true
en accepts_nested_attributes
permite eliminar un question_output desde el formulario de pregunta a través del _destroy=1
HTML.
La :dependent => :destroy
elimina el question_output cuando borra la pregunta. O, en su caso, borra el question_output cuando es reemplazado por uno nuevo.