2016-12-09 4 views
0

Извиняется за вопрос о noob/плохое форматирование. Его первый пост. Я попытаюсь объяснить ясно. В моем приложении у меня есть два объекта: quiz и quiz_question.Rails update каждый раз создает новый объект

Я хочу создать викторину, в которой есть 10 вопросов, связанных с ней, но вы хотите создать их более 10 страниц, а не одну длинную форму на одной странице. Я пытаюсь обновить объект викторины, но когда метод обновления вызовов, он добавляет все вопросы снова, поэтому число объектов быстро увеличивается 1, 3, 7 и т.д.

quiz имеет много quiz questions

это мой контроллер:

def new 
    @quiz = Quiz.new 
    1.times{@quiz.quiz_questions.new} 
end 

def create 
    # return render json:params 
    @quiz = Quiz.new(quiz_params) 
    respond_to do |format| 
    if @quiz.save 
     format.html{ redirect_to edit_quiz_path(@quiz.id)} 
    else 
     format.html{ render :new} 
    end 
    end 
end 

def edit 
    # return render json:params 
    @quiz = Quiz.find params[:id] 
    1.times{@quiz.quiz_questions.new} 
end 

def update 
    #return render json:params 
    @quiz = Quiz.find params[:id] 
    @quiz.update(quiz_params) 
    respond_to do |format| 
    if @quiz.save && @quiz.quiz_questions.count < 10 
     format.html{ redirect_to edit_quiz_path(@quiz.id)} 
    elsif @quiz.save && @quiz.quiz_questions.count > 10 
     format.html{ redirect_to dashboard_teachers_path, notice: "Quiz Created Successfully"} 
    else 
     format.html{ render :edit} 
    end 
    end 
end 

И это мое мнение редактировать

<%= simple_form_for(@quiz, :defaults => { :input_html => { :class => "hello" } }) do |f| %> 
<%= f.error_notification %> 

<%= f.simple_fields_for :quiz_questions do |builder| %> 
<p><%= builder.input :question %></p> 
<p><%= builder.input :correct_answer %></p> 
<p><%= builder.input :incorrect_answer1 %></p> 
<p><%= builder.input :incorrect_answer2 %></p> 
<p><%= builder.input :incorrect_answer3 %></p> 
<% end %> 

<%= f.button :submit, class: "btn btn-default" %> 
<% end %> 
</div> 
</div> 
</div> 
</div> 
</div> 


<script type="text/javascript"> 
$(window).load(function() { 
    $('input[type=text], textarea').each(function() { 
     // Cache pointer to selected dom element. 
     // Don't need to parse entire html each time you need that. 
     var input = $(this); 

     // .val() will return empty string if there is no value 
     // 0 means false in this case don't need to use equality check 
     if (!input.val()) { 
     input.parent().css("display", "block"); 
     } else { 
     input.parent().css("display", "none"); 
     } 
    }); 

}) 
</script> 

EDIT: Для ясности. Я хочу продвигаться через действие редактирования 10 раз, каждый раз добавляя новый объект quiz_question и назначая его объекту quiz.

+0

Я думаю, что вы делаете 'Post' вызов вместо' PUT' или 'PATCH'. POST создаст новую запись, тогда как PUT и PATCH просто обновят существующую запись. – aks

+0

Спасибо за ваш ответ, но это не сработало. Я думаю, что я не ясно объяснил, что я пытаюсь сделать. Я добавил уточняющее редактирование, которое, я надеюсь, поможет. –

+0

Я не совсем понимаю, что вы хотите делать, но если вы только хотите создавать вопросы, у вас не может быть формы для '@ quiz'. Каждый раз, когда он отправляется, он собирается создать новый объект Quiz. –

ответ

0

, если вы хотите, чтобы вызвать действие обновления, вам необходимо использовать PUT:

<%= simple_form_for(@quiz, :method => :put, :defaults => { :input_html => { :class => "hello" } }) do |f| %> 
+0

Спасибо за ваш ответ, но это не сработало. Я думаю, что я не ясно объяснил, что я пытаюсь сделать. Я добавил уточняющее редактирование, которое, я надеюсь, поможет. –