在rails4中以嵌套形式面对编辑更新操作中的问题?

时间:2015-06-17 07:01:42

标签: ruby-on-rails ruby-on-rails-4 nested-forms

您好我正在使用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”}

请指导我如何解决这个问题。提前谢谢。

3 个答案:

答案 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