update through rails many has form for fields_for example belongs and accepts_nested_attributes_for accepts ruby-on-rails nested-attributes has-one

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.