2013-01-16 20 views
15

'question'モデルで入れ子になったquestion_output属性を更新しようとしています。質問has_one question_output。 データベースにquestion_outputsが存在しない場合、すべて正常に動作します。しかし、レコードに既にquestion_outputがある場合、更新しようとすると次のようになります。Railsネストhas_one:既存のレコードを削除できません

既存の関連するquestion_outputを削除できませんでした。外部キーがnilに設定された後にレコード が保存に失敗しました。

私はallow_destroyがそれを世話すると思っていましたが、悲しいかな、喜びはありません。確かに私はずっと前にhas_oneを使っていない。しかし、誰かがこれを修正する方法に関するアイデアを持っているなら、私は感謝しています。以下関連コード:

形態:

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

質問モデル:

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

QuestionOutputモデル:

class QuestionOutput < ActiveRecord::Base 
    belongs_to :question 
end 

質問コントローラ:

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 
あなたの質問のモデルで

答えて

29

にhas_oneの行を変更:accepts_nested_attributes

has_one :question_output, :dependent => :destroy 

:allow_destroy => trueあなたは_destroy=1 HTML属性を経由して、質問フォーム内からquestion_outputを削除することができます。

:dependent => :destroyは、質問を削除するときにquestion_outputを削除します。 あなたのケースでは、は、それが新しいものに置き換えられたときにquestion_outputを削除します。

+0

Ach!もちろん、Devinに感謝しています。 – PlankTon

+0

こんにちは、私はこのような状況に陥っています。ユーザーを更新しようとすると、@PlankTonと同じエラーが表示されます。従属=>:破棄、ユーザーを更新するたびに情報は関連を破壊し、異なるIDを持つ新しいIDを作成します。それを作成し、それを作成することなく、正当な関連付けを使用する方法があります – medBo

+2

@medBoはあなたの質問に答えようとしていましたが、それは[ここ](http://stackoverflow.com/questions/18984093/cant-update-my- –

1

新しいレコードを作成するたびに、何らかのオーバーヘッドが発生します。 レコードIDを持つ隠しフィールドを含めるだけで、破棄する代わりに更新されます。

= qo.hidden_field :id 
関連する問題