在 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

发生这种情况可能是因为您不允许 idchoices_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