如果您有以下两个模型并使用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天。任何帮助将不胜感激。
答案 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。)
我不知道了,抱歉。