2013-01-16 9 views
15

Próbuję zaktualizować zagnieżdżone atrybuty question_output w modelu "pytanie". Pytanie has_one question_output. Jeśli nie ma istniejących zapytań w bazie danych, wszystko działa poprawnie. Ale jeśli płyta ma już question_output, otrzymuję następujące podczas próby aktualizacji:Zagnieżdżone szyny has_one: nie można usunąć istniejącego rekordu

udało się usunąć istniejącą powiązanych question_output. Zapis nie został zapisany, gdy po ustawieniu klucza obcego na zero.

Byłbym przekonany, że pozwól_destroy to załatwić, ale niestety - bez radości. Trzeba przyznać, że już wcześniej nie użyłem has_one. Ale jeśli ktoś ma jakieś pomysły, jak to naprawić, byłbym wdzięczny. Odpowiedni kod poniżej:

Postać:

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

modelu Pytanie:

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

QuestionOutput model:

class QuestionOutput < ActiveRecord::Base 
    belongs_to :question 
end 

Pytania kontroler:

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 

Odpowiedz

29

W modelu zapytania zmienić linię do has_one:

has_one :question_output, :dependent => :destroy 

:allow_destroy => true na accepts_nested_attributes pozwala usunąć question_output z poziomu formularza zapytania poprzez atrybut _destroy=1 HTML.

Po usunięciu pytania :dependent => :destroy usuwa parametr question_output. Lub w twoim przypadku usuwa parametr question_output, gdy jest zastępowany przez nowy.

+0

Ach! Oczywiście - wielkie dzięki Devin. – PlankTon

+0

cześć, jestem w takiej sytuacji, mam adres użytkownika has_one kiedy próbuję aktualizować mojego użytkownika daje mi ten sam błąd co @PlankTon, jeśli używam: dependent =>: destroy, za każdym razem aktualizuję user informacje niszczą skojarzenia i tworzą nowe o innym id! jest metoda, która pozwala wykorzystać skojarzenie testowe bez niszczenia, a następnie ją utworzyć. – medBo

+2

@medBo miał właśnie odpowiedzieć na twoje pytanie, ale dostał odpowiedź [tutaj] (http://stackoverflow.com/questions/18984093/cant-update-my- nested-model-form-for-has-one-association) –

1

Za każdym razem tworzenie nowego rekordu jest pewnego rodzaju obciążeniem. Musisz po prostu dołączyć ukryte pole z rekordowym identyfikatorem i zostanie ono zaktualizowane zamiast zniszczyć

= qo.hidden_field :id 
Powiązane problemy