through tag rails options_for_select has_one has_many has_and_belongs_to_many example collection ruby-on-rails

ruby on rails - tag - Rails has_many: through y collection_select with multiple



rails has_one through (1)

Tengo el problema resuelto. En este caso, el uso de fields_for fue el error. La solución está utilizando un collection_select, como este:

<%= collection_select(:ingredient, :supplier_ids, Supplier.all(:order=>"name ASC"), :id, :name, {:selected => @ingredient.supplier_ids, :include_blank => true}, {:multiple => true}) %>

Tengo el siguiente problema al usar un has_many: a través de una relación de muchos a muchos en una selección múltiple a través de collection_select: multiple => true. Tengo proveedores que entregan muchos ingredientes que pueden ser entregados por muchos proveedores. Echar un vistazo:

El modelo de ingredientes:

class Ingredient < ActiveRecord::Base has_many :ingredient_suppliers accepts_nested_attributes_for :ingredient_suppliers, :allow_destroy => true has_many :suppliers, :through => :ingredient_suppliers end

El modelo del proveedor:

class Supplier < ActiveRecord::Base has_many :ingredient_suppliers has_many :ingredients, :through => :ingredient_suppliers end

La entidad de relación:

class IngredientSupplier < ActiveRecord::Base belongs_to :ingredient belongs_to :supplier end

Y esta es la forma. Tenga en cuenta que no podría hacerlo funcionar sin especificar el: nombre:

<%= 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 %>

Si elimino el: nombre, aparece este mensaje de error:

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"]}}}

El problema ahora es que los parámetros PUT solo contienen un ID de proveedor en lugar de una matriz de ID de proveedor:

"ingredient"=>{"name"=>"Rohstoff 3", "nr"=>"00300", "unit"=>"Stk.", "mol_per_unit"=>"0,00000", "description"=>"", "supplier_ids"=>"2"}