Budowanie selecta - proste

Witam,

prosty projekt książki kucharskiej na potrzeby nauki

[code]class Recipe < ActiveRecord::Base
has_many :compositions
has_many :ingredients, :through => :compositions

class Composition < ActiveRecord::Base
belongs_to :recipe
belongs_to :ingredient

class Ingredient < ActiveRecord::Base
has_many :compositions
has_many :recipes, :through => :compositions[/code]
I teraz tworząc nowy przepis chcę mieć możliwość wybrania składnika z listy (i podania jego ilości - string).

Coś takiego działa tak jak chcę:

<select name="recipe[compositions_list][][ingredient_id]" id="recipe_compositions__ingredient_id" onchange="" size="1"> <option value="1">Marchewka</option> <option value="2">Wieprzowina</option> </select>
Działa też jak opcje wypiszę za pomocą helpera (.find tylko na potrzeby przykładu):

<%= options_from_collection_for_select(Ingredient.find(:all, :order => "name"), 'id', 'name') %>

Jednak nie potrafię tego zamknąć w helper select

Próbowałem (@ingredients jest odpowiednio ustawione w controlerze):

<%= select("recipe[compositions_list]", "ingredient_id", @ingredients) %>

ale dostaję: error500 (expected Array (got Hash) for param `compositions_list’)

Oraz (dodatkowe nawiasy kwadratowe, żeby zrobić Array):

<%= select("recipe[compositions_list][]", "ingredient_id", @ingredients) %>

ale dostaję: `@recipe[compositions_list]’ is not allowed as an instance variable name.

No i już nie mam pojęcia. Możecie podpowiedzieć co robię nie tak?

spróbuj jako 3ci parametr

@igredients.map {|i| [i.name, i.id]}) (name albo title czy co tam masz w modelu)

Może ten artykuł coś rozjasni http://shiningthrough.co.uk/Select-helper-methods-in-Ruby-on-Rails

Dzięki za szybką odpowiedź.

Ingredients zawiera, to co trzeba: @ingredients = Ingredient.find(:all, :order => “name”).map { |x| [x.name, x.id] }.

Problem jest w innym miejscu…

Pierwszy argument jaki masz w select to metoda wywoływana na każdym obiekcie Ingredient. Prawdopodobnie powinineś użyć select_tag.

Pierwszy argument jaki mam w select to obiekt, na którym będzie wywołana metoda z drugiego arguementu (konkretnie przypisanie id z listy rozwijanej).

Czemu akurat select_tag?

Pierwszy argument w Twoim select to zwykły String, który Rails usiłuje zamienić na obiekt, stąd dostajesz błąd `@recipe[compositions_list]’ is not allowed as an instance variable name. Może powinien to być @recipe?

Sorki, zasugerowałam select_tag bo zwykle gdy trzeba wrzucać nawiasy kwadratowe do formularzy to znaczy że powinno się użyć wersji *_tag, ale mogłam nie zrozumieć do końca co próbujesz zrobić.

Potrzebowałem fields_for

Rozwiązanie znalazłem oglądając: http://railscasts.com/episodes/73-complex-forms-part-1