2010-04-20 3 views
1

Je suis en train de créer un < sélectionnez l'élément > selon la méthode de collection_select, mais il semble que pour l'option < appropriée > à sélectionner, l'identifiant passé dans collection_select doit être une variable d'instance et non une variable locale (cela se passe dans une partie).Ruby on Rails: Comment utiliser une variable locale dans un collection_select

Alors, quand je crée un < sélectionnez > pour le categories d'un product, la catégorie appropriée est sélectionnée par défaut.

_product_row.erb (NE FONCTIONNE PAS):

My product: <%= product.name %> 
<%= collection_select(:product, :category_id, @current_user.categories, :id, :name, options = {:prompt => "-- Select a category --"}) %> 

Screenshot:

alt text http://img534.imageshack.us/img534/8929/screenshot20100421at120.png

j'ai découvert que je pouvais le faire fonctionner en déclarant une variable d'instance avant la main, mais cela semble être un énorme hack pour moi.

_product_row.erb (TRAVAUX):

<% @product_select_tmp = product %> 
<%= collection_select(:product_select_tmp, :category_id, @current_user.categories, :id, :name, options = {:prompt => "-- Select a category --"}) %> 

Screenshot:

alt text http://img534.imageshack.us/img534/1958/screenshot20100421at120l.png

Parce que cette partie est itérer sur une collection de produits, je ne peux pas simplement avoir déclaré dans @product le contrôleur (IOW sauf si je manque quelque chose, le produit doit être une variable locale dans ce partiel).

Alors, comment puis-je obtenir collection_select pour sélectionner l'élément approprié lorsque je l'appelle avec une variable locale?

Répondre

2

Avez-vous essayé passer dans la clé :selected dans le hachage des options? Si vous lui fournissez le product.id actuel, il devrait se comporter comme vous l'attendez.

<%= collection_select(:product, :category_id, @current_user.categories, :id, :name, {:prompt => "-- Select a category --", :selected => product.category.id}) %>

+0

Figuré J'ajouterais ceci comme sa propre réponse car la dernière semble avoir été utile dedans et dehors elle-même, bien que n'étant pas tout à fait ce que vous cherchiez. –

+0

Merci encore Damien, qui semble avoir fait l'affaire, bien qu'il devrait être: selected => product.category.id. Si vous mettez à jour votre réponse, je la marquerai comme acceptée. Il est à noter que l'option: prompt sera toujours présente dans la liste déroulante de ce scénario (les rails sont assez intelligents pour ne pas utiliser les options si vous utilisez la méthode dans le second exemple de ma question), mais je peux vivre avec :) – mmacaulay

+0

Fait et fait. Codage heureux. –

1

Vous pouvez passer collections et désigner une partials variable locale pour les transmettre comme:

<%= render :partial => "products/product_row", :collection => @products, :as => :products %> 

La documentation pertinente: http://apidock.com/rails/ActionView/Partials

+0

Merci ... mais cela ne résout pas vraiment le problème. – mmacaulay

+0

Vous vouliez un moyen d'obtenir la variable d'instance '@ products' sans avoir à la déclarer explicitement, correct? Passer la collection désirée via 'render: partial ...: collection => @ collection' devrait faire l'affaire. Vous aurez besoin de toute la collection si vous voulez avoir une liste déroulante dans chaque ligne de la table des produits de toute façon. Ou ai-je mal compris la question? –

+0

Non, je veux pouvoir appeler collection_select avec une variable _local_, pas une variable d'instance, et avoir la bonne option à sélectionner dans le code HTML résultant. Désolé, je me rends compte que la question est un peu confuse. Peut-être que je vais essayer de le reformuler. – mmacaulay

Questions connexes