2013-01-16 8 views
15

Ich versuche geschachtelte question_output Attribute in einem 'Frage'-Modell zu aktualisieren. Eine Frage has_one question_output. Wenn keine question_outputs in der Datenbank vorhanden sind, funktioniert alles einwandfrei. Aber wenn der Datensatz bereits eine Frage_Ausgabe hat, erhalte ich beim Aktualisieren folgende Fehlermeldung:Rails verschachtelt has_one: kann vorhandenen Datensatz nicht löschen

Fehler beim Entfernen des vorhandenen zugeordneten Frageausgangs. Der Datensatz konnte nicht gespeichert werden, nachdem der Fremdschlüssel auf Null gesetzt wurde.

Ich hätte gedacht, das allow_destroy würde sich darum kümmern, aber leider - keine Freude. Zugegeben, ich habe has_one schon lange nicht mehr benutzt. Aber wenn jemand Ideen hat, wie das zu beheben ist, wäre ich dankbar. Relevante Code unten:

Die Form:

= 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' 

Frage Modell:

class Question < ActiveRecord::Base 
    has_one :question_output 
    accepts_nested_attributes_for :question_output, :allow_destroy => true 
end 

QuestionOutput Modell:

class QuestionOutput < ActiveRecord::Base 
    belongs_to :question 
end 

Fragen Controller:

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 

Antwort

29

In Ihrer Frage Modell die has_one Linie ändern:

has_one :question_output, :dependent => :destroy 

die :allow_destroy => true auf dem accepts_nested_attributes können Sie eine question_output aus der Frage Form über das _destroy=1 HTML-Attribut löschen.

Die :dependent => :destroy löscht die Frage Ausgabe, wenn Sie die Frage löschen. Oder in Ihrem Fall löscht die Frage Ausgabe, wenn es durch eine neue ersetzt wird.

+0

Ach! Natürlich - vielen Dank Devin. – PlankTon

+0

Hallo, ich bin in der Situation so, ich habe einen Benutzer has_one Adresse, wenn ich versuche, meinen Benutzer zu aktualisieren gibt es mir den gleichen Fehler wie @PlankTon, wenn ich verwende: dependent =>: zerstören, jedes Mal, wenn ich den Benutzer aktualisieren Informationen zerstören es Verband und erstellen Sie einen neuen mit anderen ID! Es gibt eine Methode, um extesting association zu verwenden, ohne zu zerstören, dann erstellen Sie es – medBo

+2

@medBo war im Begriff, Ihre Frage zu beantworten, aber sehen Sie es wurde [hier] beantwortet (http://stackoverflow.com/questions/18984093/cant-update-my- Nested-Model-Form für One-Association) –

1

Jedes Mal erstellen Sie einen neuen Datensatz ist eine Art Overhead. Sie müssen einfach verstecktes Feld mit Datensatz-ID einschließen und es wird nur aktualisiert werden, anstatt zu zerstören