我试图创建一个包含选项和子选项的嵌套表单,它们都来自称为Option的同一模型。这是文件的内容:
模型:
class Option < ApplicationRecord
belongs_to :activity
has_many :option_students
has_many :students, through: :option_students
has_many :suboptions,
class_name: "Option",
foreign_key: "option_id"
belongs_to :parent,
class_name: "Option",
optional: true,
foreign_key: "option_id"
accepts_nested_attributes_for :suboptions,
reject_if: ->(attrs) { attrs['name'].blank? }
validates :name, presence: true
end
控制器:
class OptionsController < ApplicationController
include StrongParamsHolder
def index
@options = Option.where(option_id: nil)
end
def show
@option = Option.find(params[:id])
end
def new
@option = Option.new()
1.times { @option.suboptions.build}
end
def create
@option = Option.new(option_params)
if @option.save
redirect_to options_path
else
render :new
end
end
def edit
@option = Option.find(params[:id])
end
def update
@option = Option.find(params[:id])
if @option.update_attributes(option_params)
redirect_to options_path(@option.id)
else
render :edit
end
end
def destroy
@option = Option.find(params[:id])
@option.destroy
redirect_to options_path
end
end
_form.html.erb:
<%= form_for @option do |f| %>
<p>
<%= f.label :name %><br>
<%= f.text_field :name %><br>
<%= f.label :activity %><br>
<%= select_tag "option[activity_id]", options_for_select(activity_array) %><br>
</p>
<div>
<div id="suboptions">
<%= f.fields_for :suboptions do |suboption| %>
<%= render 'suboption_fields', f: suboption %>
<% end %>
<div class="links">
<%= link_to_add_association 'add suboption', f, :suboptions %>
</div>
</div>
</div>
<p>
<%= f.submit "Send" %>
</p>
<% end %>
_suboption_fields.html.erb
<div class="nested-fields">
<%= f.label :suboption %><br>
<%= f.text_field :name %>
<%= link_to_remove_association "X", f %>
</div>
StrongParamsHolder:
def option_params
params.require(:option).permit(:name, :activity_id, :students_ids => [], suboptions_attributes: [:id, :name])
end
该视图已正确创建,但未保存。它在创建控制器上转到“ render:new”。我认为参数应该是一个问题,但我不确定是什么。
可能由于验证失败而无法保存。如果您使用的belongs_to
是Rails 5,则现在更加严格,并且要保存嵌套参数,您需要使关联之间的连接/关系明确。
因此,如果您inverse_of
按如下所示添加关系,恕我直言,它将起作用:
has_many :suboptions,
class_name: "Option",
foreign_key: "option_id",
inverse_of: :parent
belongs_to :parent,
class_name: "Option",
optional: true,
foreign_key: "option_id"
inverse_of: :suboptions
如果另一个验证失败,它也可以帮助您列出表单中的错误(例如,可能@option.errors.full_messages.inspect
会有所帮助:)
顺便说一句:我将option_id
数据库中的字段重命名为,以便parent_id
更清楚地传达其含义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句