具有嵌套属性的表单和has_many:通过关系创建新记录而不是使用现有记录

时间:2016-02-03 14:39:32

标签: ruby-on-rails ruby-on-rails-4 nested-attributes


我尝试做的是Plate的简单形式,您可以选择您想要的成分。配料的数量和名称可能会有所不同。
每次创建新Plate时,它都会创建4个具有ingredient_idchosen以及布尔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的第一个问题,如果我的问题出现问题,请告诉我

1 个答案:

答案 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的隐藏字段...以确保它在属性哈希中返回。