【发布时间】:2019-05-30 17:48:32
【问题描述】:
我正在运行 Rails 6.0.0.rc1,但无法让三重嵌套表单正常工作。我有products 有options 有option_values。因此,产品可能有一个名为“颜色”的选项和一个名为“红色”的选项值。我想在产品表单的classic nested form 中创建所有这些。
表单有效,我可以保存带有选项的产品,但不能保存提交时的选项值。当我尝试在 fields_for 选项中嵌入 fields_for 选项值时,我不确定为什么它不起作用。
我在这里做错了什么?我觉得我错过了一些明显的东西,但无法弄清楚。 (可能不相关,但请注意,我需要将每个对象的范围限定为 account_id 和我的用户 has_one :account,这就是隐藏字段的原因。)
这是我的产品型号:
class Product < ApplicationRecord
belongs_to :account
has_many :options, dependent: :destroy
accepts_nested_attributes_for :options, allow_destroy: true
validates :account_id, presence: true
validates :name, presence: true
end
选项型号:
class Option < ApplicationRecord
belongs_to :account
belongs_to :product
has_many :option_values, dependent: :destroy
accepts_nested_attributes_for :option_values, allow_destroy: true
validates :account_id, presence: true
validates :name, presence: true
end
OptionValue 模型:
class OptionValue < ApplicationRecord
belongs_to :account
belongs_to :option
validates :account_id, presence: true
validates :name, presence: true
end
这是产品表单:
<%= form_with(model: product, local: true) do |f| %>
<%= f.fields_for :options do |options_form| %>
<fieldset class='form-group'>
<%= options_form.hidden_field :account_id, value: current_user.account.id %>
<%= options_form.label :name, 'Option' %>
<%= options_form.text_field :name, class: 'form-control' %>
</fieldset>
<%= f.fields_for :option_values do |values_form| %>
<fieldset class='form-group'>
<%= values_form.label :name, 'Value' %>
<%= values_form.text_field :name, class: 'form-control' %>
</fieldset>
<% end %>
<% end %>
<% end %>
产品控制器:
class ProductsController < ApplicationController
def new
@product = Product.new
@product.options.build
end
def create
@account = current_user.account
@product = @account.products.build(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
else
format.html { render :new }
end
end
end
private
def product_params
params.require(:product).permit(
:account_id, :name,
options_attributes: [
:id, :account_id, :name, :_destroy,
option_values_attributes:[:id, :account_id, :name, :_destroy ]
]
)
end
end
【问题讨论】:
-
在
f.fields_for :option_values这个表单中嵌套在主表单里面,但是应该嵌套在options_form里面 -
谢谢,但
f.fields_for :option_values不是嵌套在f.fields_for :options中吗? -
它是嵌套在 html 标记方面,但不是在 rails form_helper 方面。应该是
options_form.fields_for :option_values -
另外,表单中没有 option_values 的 account_id 字段,但该属性已验证。
-
好的,这是有道理的,但是当我添加
<%= options_form.fields_for :option_values do |values_form| %>时,它不会在浏览器中呈现values_form字段。
标签: ruby-on-rails ruby forms nested-forms strong-parameters