Rails has_many:通过和collection_select与多个
问题描述:
我有以下问题使用has_many:通过多选择通过collection_select:multiple => true中的多对多关系。我有供应商提供许多供应商可以交付的成分。看一看:Rails has_many:通过和collection_select与多个
成分模型:
class Ingredient < ActiveRecord::Base
has_many :ingredient_suppliers
accepts_nested_attributes_for :ingredient_suppliers, :allow_destroy => true
has_many :suppliers, :through => :ingredient_suppliers
end
供应商型号:
class Supplier < ActiveRecord::Base
has_many :ingredient_suppliers
has_many :ingredients, :through => :ingredient_suppliers
end
的关系实体:
class IngredientSupplier < ActiveRecord::Base
belongs_to :ingredient
belongs_to :supplier
end
这是形式。请注意,我不能让它在不指定工作:名称:
<%= form_for(@ingredient) do |f| %>
<%= f.fields_for :suppliers do |supplier_fields| %>
<%= supplier_fields.collection_select (:supplier_ids,
Supplier.all(:order=>"name ASC"),
:id, :name,
{:selected => @ingredient.supplier_ids,
:include_blank => true},
{:multiple => true,
:name => 'ingredient[supplier_ids]'}) %>
<% end %>
<% end %>
如果我删除了:名字,然后我得到这个错误信息:
Supplier(#-617951108) expected, got Array(#-608411888)
Request
Parameters:
{"commit"=>"Anlegen",
"authenticity_token"=>"MuEYtngwThharmM1KaAbH8JD3bScXiDwj0ALMytxl7U=",
"_method"=>"put",
"utf8"=>"✓",
"id"=>"1",
"ingredient"=>{"name"=>"Ingredient 1",
"nr"=>"00100",
"unit"=>"kg",
"mol_per_unit"=>"2000,
00000",
"description"=>"",
"suppliers"=>{"supplier_ids"=>["1",
"2"]}}}
现在的问题是,该PUT参数只包含一个supplier_id而不是一个supplier_ids数组:
"ingredient"=>{"name"=>"Rohstoff 3", "nr"=>"00300", "unit"=>"Stk.", "mol_per_unit"=>"0,00000", "description"=>"", "supplier_ids"=>"2"}
答
我已经解决了问题。在这种情况下,使用fields_for是错误。解决方法是使用一个collection_select,像这样:
<%= collection_select(:ingredient, :supplier_ids,
Supplier.all(:order=>"name ASC"),
:id, :name, {:selected => @ingredient.supplier_ids, :include_blank => true}, {:multiple => true}) %>
+5
是否必须在控制器中运行任何类型的内部版本?你能用控制器和视图的完整代码更新你的答案吗? –
请问您可以显示控制器的代码吗? – Skiapex