您好我正在使用gem "nested_form"
并在我的应用示例代码中包含has_many关联:
class Question < ActiveRecord::Base
has_many :choices
accepts_nested_attributes_for :choices
end
并且在我的控制器中包含了这个:
class QuestionsController < ApplicationController
before_action :set_questions, only: [:edit, :update]
def edit
end
def update
if @question.update_attributes(question_params)
redirect_to questions_path
else
render :action => :edit
end
end
private
def set_questions
@question = Question.where(:id => params[:id]).first
end
def question_params
params.require(:question).permit(:content,
choices_attributes: [:option, :is_correct,
:question_id])
end
end
和edit.html.erb
<%= nested_form_for @question do |f|%>
<%= f.label :content %>
<%= f.text_field :content %>
<%= f.fields_for :choices do |c| %>
<%= c.label :option %>
<%= c.text_field :option %>
<%= c.check_box :is_correct%>
<%= c.label :is_correct %>
<% end %>
<%= f.link_to_add "Add Choices", :choices%>
</br>
<%= f.submit %>
<% end %>
因此在编辑时它会添加选项,即使它们存在,我甚至没有编辑/添加任何选项 如果我已经有3个关于question_id = 1的选择,那么在编辑时我没有编辑任何选项,也没有为该question_id添加任何新内容,但是在提交时它也创建了3个选项。它提交了这个参数
参数:{“utf8”=&gt;“✓”, “authenticity_token”=&gt; “中jTLaIz0BdKbSZgnMl4T2GhZyYbKvo0JG2VD8e1zbvQGp6ILyKqLOZy19QvZrXhVGr5OClcwibWL0HJwIAGJ / RQ ==”, “question”=&gt; {“content”=&gt;“业务逻辑定义在?”, “choices_attributes”=&gt; {“0”=&gt; {“选项”=&gt;“模型”,“is_correct”=&gt;“1”, “id”=&gt;“36”},“1”=&gt; {“选项”=&gt;“查看”,“is_correct”=&gt;“0”,“id”=&gt;“37”}, “2”=&gt; {“选项”=&gt;“控制器”,“is_correct”=&gt;“0”,“id”=&gt;“38”}, “3”=&gt; {“选项”=&gt;“帮助者”,“is_correct”=&gt;“0”,“id”=&gt;“39”}}}, “commit”=&gt;“更新问题”,“id”=&gt;“10”}
请指导我如何解决这个问题。提前谢谢。
答案 0 :(得分:1)
问题出在question_params
。您必须为编辑/更新添加:id
才能正常工作,否则每次成功提交都会创建新记录。
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end
答案 1 :(得分:1)
可能会发生这种情况,因为您未在id
中允许choices_attributes
选择。
nested_form
会将每个选项属性视为在提交时创建新记录,如果它不包含id
。
答案 2 :(得分:0)
你的rails控制台必须提供未经许可的参数:id因为你没有将id传递给update_attributes这就是为什么它要创建新对象,你需要做的就是
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end