在 rails4 中以嵌套形式编辑更新操作时遇到问题?
Facing issue in edit-update action in nested form in rails4?
您好,我正在使用 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 %>
所以在编辑中它添加了选项,即使它们存在,我什至 edit/add 没有任何选择。
如果我已经有关于 question_id=1 的 3 个选择,那么在编辑时我没有编辑任何选择,也没有为 question_id 添加任何新选择,但在提交时也是如此它创造了 3 个更多的选择。它在提交时给出了这个参数
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"jTLaIz0BdKbSZgnMl4T2GhZyYbKvo0JG2VD8e1zbvQGp6ILyKqLOZy19QvZrXhVGr5OClcwibWL0HJwIAGJ/rQ==",
"question"=>{"content"=>"Business logic is defined in ?",
"choices_attributes"=>{"0"=>{"option"=>"Model", "is_correct"=>"1",
"id"=>"36"}, "1"=>{"option"=>"view", "is_correct"=>"0", "id"=>"37"},
"2"=>{"option"=>"controller", "is_correct"=>"0", "id"=>"38"},
"3"=>{"option"=>"helpers", "is_correct"=>"0", "id"=>"39"}}},
"commit"=>"Update Question", "id"=>"10"}
请指导我如何解决这个问题。提前致谢。
问题出在您的 question_params
上。您必须为 edit/update 添加 :id
才能正常工作,否则它会在每次成功提交时创建 新记录 。
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end
发生这种情况可能是因为您不允许 id
在 choices_attributes
中进行选择。
nested_form
将每个选择属性视为在提交时创建新记录(如果它不包含 id
)。
你 rails 控制台必须给出未经许可的参数作为 :id 因为你没有将 id 传递给 update_attributes 这就是它创建新对象的原因,你需要做的就是
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end
您好,我正在使用 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 %>
所以在编辑中它添加了选项,即使它们存在,我什至 edit/add 没有任何选择。
如果我已经有关于 question_id=1 的 3 个选择,那么在编辑时我没有编辑任何选择,也没有为 question_id 添加任何新选择,但在提交时也是如此它创造了 3 个更多的选择。它在提交时给出了这个参数
Parameters: {"utf8"=>"✓", "authenticity_token"=>"jTLaIz0BdKbSZgnMl4T2GhZyYbKvo0JG2VD8e1zbvQGp6ILyKqLOZy19QvZrXhVGr5OClcwibWL0HJwIAGJ/rQ==", "question"=>{"content"=>"Business logic is defined in ?", "choices_attributes"=>{"0"=>{"option"=>"Model", "is_correct"=>"1", "id"=>"36"}, "1"=>{"option"=>"view", "is_correct"=>"0", "id"=>"37"}, "2"=>{"option"=>"controller", "is_correct"=>"0", "id"=>"38"}, "3"=>{"option"=>"helpers", "is_correct"=>"0", "id"=>"39"}}}, "commit"=>"Update Question", "id"=>"10"}
请指导我如何解决这个问题。提前致谢。
问题出在您的 question_params
上。您必须为 edit/update 添加 :id
才能正常工作,否则它会在每次成功提交时创建 新记录 。
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end
发生这种情况可能是因为您不允许 id
在 choices_attributes
中进行选择。
nested_form
将每个选择属性视为在提交时创建新记录(如果它不包含 id
)。
你 rails 控制台必须给出未经许可的参数作为 :id 因为你没有将 id 传递给 update_attributes 这就是它创建新对象的原因,你需要做的就是
def question_params
params.require(:question).permit(:id, :content, choices_attributes: [:id, :option, :is_correct, :question_id])
end