使用复选框以嵌套形式为嵌套属性预定义字段
Pre-defined fields for nested attribute in nested form using checkbox
我有一个模型 Food,其中有很多 food_varients。 FoodVarient 是一个将由系统管理员设置的模型。 例如食物种类可以是热的、辣的、额外的奶酪等。食物可以有这些种类。
因为 Food has_many food_varients, 我决定使用嵌套形式允许管理员创建一个新的 食品 以及 select food_varients 食品可能来自预定义的 food_varients 由管理员预先创建。
这是我的 FoodsController
的样子:
class FoodsController < DashboardBaseController
# GET /foods/new
def new
@food = current_department.foods.new
@food.food_varients.build
end
# GET /foods/1/edit
def edit
end
def food_params
params.require(:food).permit(:name, :description,food_varients_attributes[:id,:varient_id])
end
end
我也在我的 Food.rb
文件中接受了嵌套属性,如下所示:
class Food < ApplicationRecord
has_many :food_varients, dependent: :destroy
has_many :varients, through: :food_varients, dependent: :destroy
accepts_nested_attributes_for :food_varients, reject_if: proc { |attributes| attributes['varient_id'] == "0" }
这就是我添加食物的表格:
= form_for @food do |f|
.field.form-group
= f.label :name
= f.text_field :name, class: 'form-control', tabindex: 1
.field.form-group
= f.label :description
= f.text_area :description, class: 'form-control', tabindex: 3
........
//**Nested Form Starts from here**
- current_department.varients.each do |varient|
= f.fields_for :food_varients do |g|
= g.label :varient_id, varient.title
= g.check_box :varient_id,{} ,varient.id
我通过循环由管理员创建的 Varient 模型的每个实例来创建嵌套表单,并为管理员提供添加 food_varients 因为正在创建新的食品。
问题:
创建工作正常,并且正在按预期保存嵌套属性。
但是,当我尝试编辑 食品项目 时,嵌套表单显示重复字段。
例如:如果最初将食物设置为有变种(甜的和酸的)。现在,食品项的编辑页面向我显示了 4 个字段,而不是两个,其中两个已选中糖醋字段,两个未选中。酸甜田.
是否有我必须尝试的不同方法?因为我看到的其他示例使用 text_fields 来动态保存嵌套属性,而我正在遍历已经存在的 varient实例。
您在这里根本不需要使用嵌套属性。只需将收集助手与 varient_ids=
setter:
一起使用
= form_for @food do |f|
.field.form-group
= f.label :name
= f.text_field :name, class: 'form-control', tabindex: 1
.field.form-group
= f.label :description
= f.text_area :description, class: 'form-control', tabindex: 3
.field.form-group
= f.label :varient_ids
= f.collection_select :varient_ids, Varient.all, :id, :name
class FoodsController < DashboardBaseController
# GET /foods/new
def new
@food = current_department.foods.new
end
# ...
def food_params
params.require(:food).permit(:name, :description, varient_ids: [])
end
end
Rails 将自动 add/destroy 行加入 table。正确的拼写也是变体:
variant (plural variants)
Something that is slightly different from a type or norm.
- https://en.wiktionary.org/wiki/variant#English
我有一个模型 Food,其中有很多 food_varients。 FoodVarient 是一个将由系统管理员设置的模型。 例如食物种类可以是热的、辣的、额外的奶酪等。食物可以有这些种类。
因为 Food has_many food_varients, 我决定使用嵌套形式允许管理员创建一个新的 食品 以及 select food_varients 食品可能来自预定义的 food_varients 由管理员预先创建。
这是我的 FoodsController
的样子:
class FoodsController < DashboardBaseController
# GET /foods/new
def new
@food = current_department.foods.new
@food.food_varients.build
end
# GET /foods/1/edit
def edit
end
def food_params
params.require(:food).permit(:name, :description,food_varients_attributes[:id,:varient_id])
end
end
我也在我的 Food.rb
文件中接受了嵌套属性,如下所示:
class Food < ApplicationRecord
has_many :food_varients, dependent: :destroy
has_many :varients, through: :food_varients, dependent: :destroy
accepts_nested_attributes_for :food_varients, reject_if: proc { |attributes| attributes['varient_id'] == "0" }
这就是我添加食物的表格:
= form_for @food do |f|
.field.form-group
= f.label :name
= f.text_field :name, class: 'form-control', tabindex: 1
.field.form-group
= f.label :description
= f.text_area :description, class: 'form-control', tabindex: 3
........
//**Nested Form Starts from here**
- current_department.varients.each do |varient|
= f.fields_for :food_varients do |g|
= g.label :varient_id, varient.title
= g.check_box :varient_id,{} ,varient.id
我通过循环由管理员创建的 Varient 模型的每个实例来创建嵌套表单,并为管理员提供添加 food_varients 因为正在创建新的食品。
问题:
创建工作正常,并且正在按预期保存嵌套属性。 但是,当我尝试编辑 食品项目 时,嵌套表单显示重复字段。 例如:如果最初将食物设置为有变种(甜的和酸的)。现在,食品项的编辑页面向我显示了 4 个字段,而不是两个,其中两个已选中糖醋字段,两个未选中。酸甜田.
是否有我必须尝试的不同方法?因为我看到的其他示例使用 text_fields 来动态保存嵌套属性,而我正在遍历已经存在的 varient实例。
您在这里根本不需要使用嵌套属性。只需将收集助手与 varient_ids=
setter:
= form_for @food do |f|
.field.form-group
= f.label :name
= f.text_field :name, class: 'form-control', tabindex: 1
.field.form-group
= f.label :description
= f.text_area :description, class: 'form-control', tabindex: 3
.field.form-group
= f.label :varient_ids
= f.collection_select :varient_ids, Varient.all, :id, :name
class FoodsController < DashboardBaseController
# GET /foods/new
def new
@food = current_department.foods.new
end
# ...
def food_params
params.require(:food).permit(:name, :description, varient_ids: [])
end
end
Rails 将自动 add/destroy 行加入 table。正确的拼写也是变体:
variant (plural variants)
Something that is slightly different from a type or norm.
- https://en.wiktionary.org/wiki/variant#English