我尝试做的是Plate的简单形式,您可以选择您想要的成分。配料的数量和名称可能会有所不同。
每次创建新Plate时,它都会创建4个具有ingredient_id
和chosen
以及布尔plate_id
的新选项。
ingredient_id
来自新版块创建,chosen
应该是我数据库中现有成分的ID,class Plate < ActiveRecord::Base
has_many :choices
has_many :ingredients, through: :choices
accepts_nested_attributes_for :choices
end
class Choice < ActiveRecord::Base
belongs_to :plate
belongs_to :ingredient
accepts_nested_attributes_for :ingredient
end
class Ingredient < ActiveRecord::Base
has_many :choices
has_many :plates, through: :choices
end
如果成分应该放在盘子中 <div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<%= f.fields_for :choices do |fc| %>
<%= fc.check_box :chosen %>
<%= fc.fields_for :ingredient do |fi| %>
<%= fi.text_field(:name)%> <br />
<% end %>
<% end %>
。
这是我的课程板块,选择和成分:
def new
@plate = Plate.new
@choice1 = @plate.choices.build
@choice2 = @plate.choices.build
@choice3 = @plate.choices.build
@choice4 = @plate.choices.build
@ingredient1 = Ingredient.find_by_name('peach')
@ingredient2 = Ingredient.find_by_name('banana')
@ingredient3 = Ingredient.find_by_name('pear')
@ingredient4 = Ingredient.find_by_name('apple')
@choice1.ingredient_id = @ingredient1.id
@choice2.ingredient_id = @ingredient2.id
@choice3.ingredient_id = @ingredient3.id
@choice4.ingredient_id = @ingredient4.id
end
def plate_params
params.require(:plate).permit(:name, choices_attributes: [:chosen, ingredient_attributes: [ :name]])
end
我的Plate嵌套表单看起来像这样:
:id
最后我的Plate控制器:
params.require(:plate).permit(:name, choices_attributes: [:chosen, ingredient_attributes: [:id, :name]])
我的问题是,当我创建一个新盘子时,它会创建与所选盘子名称相同的新成分(但当然具有不同的ID),并且Choices具有创建的新成分的ingredient_id。
我尝试在嵌套属性中添加myrange.AutoFilter Field:=7, Criteria1:="<>101", Operator:=xlAnd, Criteria2:="<>102", Operator:=xlAnd
:
$("div[data-events='Work In Progress']" ).css('background-color', 'black');
我这样做的时候,我发了一个错误:
对于ID =
的选项,找不到ID = 1的成分
我搜索了答案但找不到任何答案,我想我不知道Rails params,form和嵌套属性足以理解问题出在哪里。
感谢您的帮助!
ps:这是关于Stack Overflow的第一个问题,如果我的问题出现问题,请告诉我
答案 0 :(得分:0)
您不需要accepted_nested_parameters_for :ingredient
,因为表单不是为了让您创建成分或编辑成分而设计的。
最好只使用collection_select
选择现有成分作为choice
记录的一部分(即,只保存ingredient_id)。
<%= f.fields_for :choices do |fc| %>
<%= fc.check_box :chosen %>
<%= fc.collection_select(:ingredient_id, Ingredient.all, :id, :name, prompt: true) %>
<% end %>
然后你的属性应该......
params.require(:plate).permit(:name, choices_attributes: [:chosen, :ingredient_id])
如果您只想展示成分但不允许用户更改哪种成分,您可以
<%= f.fields_for :choices do |fc| %>
<%= fc.check_box :chosen %>
<%= fc.hidden_field :ingredient_id %>
<%= Ingredient.find(fc.object.ingredient_id).name %>
<% end %>
您在表单对象fc
包含的对象中找到了ingredient_id,并使用该ID访问Ingredient,并检索name属性。
另请注意:ingredient_id
的隐藏字段...以确保它在属性哈希中返回。