Извиняется за вопрос о 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
.
Я думаю, что вы делаете 'Post' вызов вместо' PUT' или 'PATCH'. POST создаст новую запись, тогда как PUT и PATCH просто обновят существующую запись. – aks
Спасибо за ваш ответ, но это не сработало. Я думаю, что я не ясно объяснил, что я пытаюсь сделать. Я добавил уточняющее редактирование, которое, я надеюсь, поможет. –
Я не совсем понимаю, что вы хотите делать, но если вы только хотите создавать вопросы, у вас не может быть формы для '@ quiz'. Каждый раз, когда он отправляется, он собирается создать новый объект Quiz. –