在编辑上重复表单中的嵌套has_many模型,或者如果表单有验证错误

时间:2017-08-23 14:44:45

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 simple-form

如果您有以下两个模型并使用simple_form gem创建表单:

class Poll < ApplicationRecord
    has_many :poll_options, dependent: :destroy
    accepts_nested_attributes_for :poll_options
end

class PollOption < ApplicationRecord
    belongs_to :poll
end

控制器:

class PollsController < ApplicationController
    def new
        @poll = Poll.new
        @poll.poll_options.build
    end

    def edit
    end

    private
        def poll_params
           # params.fetch(:poll, {}).permit(:poll_options_attributes)
           # params.require(:poll).permit!
           params.require(:poll).permit(:title, poll_options_attributes: [ :id, :destroy, :poll_id, :label ])
        end
end

表格:

= simple_form_for(@poll) do |f|
    = f.input :title, required: true
    = f.simple_fields_for :poll_options do |option_a|
        = option_a.input :label
    = f.simple_fields_for :poll_options do |option_b|
        = option_b.input :label

如果我在没有必填字段(标签)的情况下故意提交此页面,页面会重新加载4个选项,我再次提交,6个选项等。出于某种原因,它会不断向表单添加两个选项。

此外,编辑轮询会加载4个选项而不是数据库中保存的2个选项(它显示了所有可能的选项组合)。

有关为何会发生这种情况的任何想法吗?

把头撞在墙上2天。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

呃,终于想通了。这是解决方案......

在控制器操作中,构建它两次:

2.times do
  @poll.poll_options.build
end

在视图中,只能循环一次。显然,你不能有两个循环来获得嵌套形式的两个实例:

= f.simple_fields_for :poll_options do |options|
    = options.input :label

答案 1 :(得分:0)

试试这个:

private
def poll_params
  params.require(:poll).permit(poll_options_attributes: [:id, :destroy, ...other poll option params])
end

<强>更新

def new
  @poll = Poll.new
  @poll.poll_options.build unless @poll.poll_options.any?
end

更新2 simple_form帮助器更改为simple_nested_form(不要忘记应用程序中的js。)

我不知道了,抱歉。