【问题标题】:Rails 4 fields_for form creates duplicate rows in databaseRails 4 fields_for 表单在数据库中创建重复行
【发布时间】:2016-05-04 18:10:00
【问题描述】:

我是 Rails 新手,也是 Stackoverflow 新手,所以请多多包涵。我确信在我当前的查询之外还有一些事情没有正确完成。

我有一个包含问题和提交的矩阵的应用程序,并且提交有嵌套的答案(对矩阵中的问题)。

我有一个供用户提交的表单,该表单显示特定矩阵的所有相关问题并允许用户回答这些问题。这一切都会正确呈现并保存在数据库的提交/答案表中。

但是,当我编辑提交时,它会使用先前输入的数据正确地预填充字段,以便该部分正常工作,但是当我保存它时,它只是复制了所有内容。

我确信我在我的关系声明中犯了一些错误,因为提交的每个问题应该只允许一个答案,但我已经转了几个小时,很可能找错地方了。

你可以在这里看到效果:http://digital-maturity-matrix.herokuapp.com/matrices/1/submissions/2

我的模特:

class Submission < ActiveRecord::Base
  belongs_to :matrix
  belongs_to :user
  has_many :answers, :dependent => :destroy
  accepts_nested_attributes_for :answers,
    :allow_destroy => true
end

我的控制器:

def edit
    @matrix = Matrix.find(params[:matrix_id])
    @submission = Submission.find(params[:id])
    @answers = @submission.answers
    @questions = @matrix.questions
  end

 def update
    @matrix = Matrix.find(params[:matrix_id])
    @user_id = current_user
    respond_to do |format|
      if @submission.update(submission_params)
        format.html { redirect_to matrix_submission_path(@matrix,@submission), notice: 'Submission was successfully updated.' }
        format.json { render :show, status: :ok, location: @submission }
      else
        format.html { render :edit }
        format.json { render json: @submission.errors, status: :unprocessable_entity }
      end
    end
  end

...

def submission_params
      params.require(:submission).permit(:matrix_id, :user_id, :name, :answers_attributes => [:question_answered, :choice, :question_id])
end

我的表格:

= form_for([@matrix,@submission]) do |f|
  - if @submission.errors.any?
    #error_explanation
      %h2
        = pluralize(@submission.errors.count, "error")
        prohibited this submission from being saved:
      %ul
        - @submission.errors.full_messages.each do |message|
          %li= message
    %br/
  .field  
    = f.hidden_field :matrix_id, :value => params[:matrix_id]
  .field
    = f.hidden_field :user_id, :value => current_user.id
    = f.fields_for :answers, @answers do |answer|
      .field 
        =answer.label answer.object.question_answered
        = answer.text_field :choice
      .field
        = answer.hidden_field :question_answered
      .field
        = answer.hidden_field :question_id

  .actions
    = f.submit

【问题讨论】:

    标签: ruby-on-rails forms nested


    【解决方案1】:

    在发布此消息的几秒钟内,我找到了答案。我认为编写问题的过程有所帮助。

    对于任何偶然发现这一点的人,我错过了在我的嵌套属性允许参数中包含 :id。我没有意识到这是必需的。

    所以我需要更换:

    def submission_params
          params.require(:submission).permit(:matrix_id, :user_id, :name, :answers_attributes => [:question_answered, :choice, :question_id])
    end
    

    与:

    def submission_params
          params.require(:submission).permit(:matrix_id, :user_id, :name, :answers_attributes => [:id, :question_answered, :choice, :question_id])
    end
    

    谢谢大家, TB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多