2011-09-07 5 views
2

J'apprends les rails et je suis aux prises avec cela depuis plus d'une journée maintenant et je n'arrive pas à comprendre comment faire fonctionner ça. Je veux une boîte de sélection dans mon formulaire qui peut sélectionner plusieurs éléments. Je travaille avec ce code:forme multiple select

<div class="field"> 
<%= f.label :products %><br /> 
<%= f.select :products, {"A"=>1, "B"=>2, "C"=>3, "D"=>4},{},:size=>5,:multiple=>true %> 
</div> 

Cela fonctionne bien et produit ce HTML:

<div class="field"> 
<label for="script_products">Products</label><br /> 
<select id="script_products" multiple="multiple" name="script[products][]" size="5">   
<option value="1">A</option> 
<option value="2">B</option> 
<option value="3">C</option> 
<option value="4">D</option></select> 
</div> 

Ce que je peux comprendre comment les résultats sont envoyés/stockés. À mon avis pour l'action "show", si j'imprimer simplement: produits que je reçois ceci:

Produits: --- - '1' - '2' - '3'

Si j'imprimer : products.inspect Je reçois ceci:

Produits: "--- \ n '1' \ n '2' \ n '3' \ n"

et la classe est une chaîne. Je pense qu'il serait stocké comme un tableau, mais je ne peux pas le faire fonctionner. Je ne sais pas d'où viennent les tirets ou les nouvelles lignes.

+0

Vous imprimez le résultat de 'params [: script] [: products]'? – nathanvda

+0

Je suis en train de faire ceci: <% = @ script.products%> –

+0

C'était le code généré par l'échafaudage. À l'origine dans la nouvelle vue, c'était un champ de texte, je l'ai changé en une boîte de sélection multiple. Donc, je pense que je dois changer de modèle pour refléter le fait que je veux stocker un tableau? Mais je ne sais pas exactement. –

Répondre

0

Je considérerais l'ajout des options comme une relation has-many sur le modèle. Ainsi, vous pouvez itérer à travers eux, les attacher et les impliquer dans une sélection multiple d'une manière (OMI) meilleure.

je ferais quelque chose comme dans mon modèle:

has_many :special_options 

À mon avis:

f.select :special_options, :multiple => true 

Cela éviterait le problème d'avoir à sérialiser et désérialiser les objets avant de les stocker.