'selected'

Yop,

comment fait ton pour ajouter une option selected dans select box

pour l’instant j’ai ca

<%= select(‘recipes’, ‘category.id’, Category.find_all.collect {|c| [
c.nom,
c.id ] }) %>
j’ai essayé d’ajouté ca

<%= ’ selected’ if category.id == @recipe.category_id %>>

mais bon ca ne marche pas :slight_smile:

merci

Bonjour,

<%= select(‘recipes’, ‘category.id’, Category.find_all.collect {|c| [
c.nom,
c.id ] }) %>

Ca ne fonctionne pas comme tu as fait ?
C’est pour tant bien proche de l’exemple de l’api
(Peak Obsession)

Voici un exemple (perso) du select_tag :

<%= select_tag(‘articles[]’, options_for_select(@articles_map,
@articles_id),
:size => 20, :multiple => true) %>

avec dans @articles_map, un tableau de paires [texte, id],
et dans @articles_id, un tableau contenant les id selected.

J’espère t’avoir éclairé.

++
Pierre M.

Salut Bolo

essaie d’ajouter :selected => value en dernier argument

cf
http://api.rubyonrails.com/classes/ActionView/Helpers/FormOptionsHelper.html#M000399

Thibaut

si tu as bien initialise (charge ?) ton object Recipe, le
“selected=selected” doit etre ajoute sur la bonne option.
si ton object n’est pas encore present dans la base de donnee
(equivelent a l’action new dans le scaffold) et que tu veux
positionner une valeur par defaut, tu peux faire, au niveau de
l’action, un:
@recipe = Recipe.new(:category_id => )

Ah oui une autre source de bug (je dis cela pour ton <%= ’ selected’
if category.id == @recipe.category_id %>), c’est quelquefois on ne
sait pas si on manipule des chaines de caracteres ou des entiers
(exemple: ‘1’ != 1). Ce que je fais, c’est que je force les valeurs
avec un to_s ou to_i suivant les cas.
Le cas le plus courant est quand tu recuperes un id d’une requete et
que tu veux faire un test: if params[:category_id] == 1 => ne marchera
jamais a priori.

J’espere que cela t’aidera

Didier

2006/4/25, Bolo [email protected]:

<%= select(‘recipes’, ‘category.id’, Category.find_all.collect {|c| [
c.nom,
c.id ] }) %>

ceci fonctionne je vois bien liste déroulante, mais j’aimerais ajouté un
selected. C

<%= select_tag(‘articles[]’,
options_for_select(@articles_map,@articles_id),:size
=> 20, :multiple => true) %>

avec dans @articles_map, un tableau de paires [texte, id],
et dans @articles_id, un tableau contenant les id selected.

Alors quelle est la différence entre select_tag et select, mais si tu
veux
mêtre un condition comme ceci
J’aimerai que la valeur soit séléctionée si category_id ==
recipe.category_id dans le tuto cookbook leur code ressemble a ca

<% @categories.each do |category| %> > <%= category.name %> <% end %>

essaie d’ajouter :selected => value en dernier argument

J’ai essayé ca
<%= select(‘recipes’, ‘category.id’, Category.find_all.collect {|c| [
c.nom,
c.id ] },{ :selected => value }) %>

j’ai ce message

undefined local variable or method `value’ for
#<#Class:0x24a96d0:0x24a96a8>

le tag select a ete cree pour etre associe a un model, fichiers que tu
trouves app/models, juste pour faciliter la tache des developpeurs.
Le tag select_tag est la forme brute lorsque par exemple tu veux
recuper une valeur qui n’est associee a aucun model ou bien quand tu
veux avoir un plus grand controle sur ton select.

Dans ton cas, le select tout seul doit marcher. Peux tu verifier que
tu declares bien ton instance recipes ? cela doit etre un @recipe dans
ton action. Verifie bien.
ah oui, ton nom n’est pas bon (d’un point de vue conventionnel):
recipes => recipe au singulier !

2006/4/25, Bolo [email protected]:

J’ai essayé ca
<%= select(‘recipes’, ‘category.id’, Category.find_all.collect {|c| [
c.nom, c.id ] },{ :selected => value }) %>

j’ai ce message

undefined local variable or method `value’ for #<#Class:0x24a96d0:0x24a96a8>

il faut remplacer value par la valeur que tu veux mettre en fait…

dans ton cas, je proscris tout bidouillage car il semble assez simple
!!!
Le bidouillage en Ruby On Rails est vraiment a utiliser en dernier
recours quand le truc n’a pas ete prevu dans le framework.

2006/4/25, didier lafforgue [email protected]:

Contrib trouvée sur le wiki

def collection_select_with_current(object, method, collection,
value_method,
text_method, current_value)
result = “\n”
for element in collection
if current_value == element.send(value_method)
result << “#{element.send(text_method)}\n”
else
result << “#{
element.send(text_method)}\n”
end
end
result << “\n”
return result
end

voila ca marche. Je pense que loco doit avoir un chack car j’ai du
redémarrer l’application pour que ca marche :frowning:

2006/4/25, Bolo [email protected]:

si tu as bien initialise (charge ?) ton object Recipe, le
“selected=selected” doit etre ajoute sur la bonne option.

Je suis pas sur de bien comprendre le sens “inistialise” mais mon champs
categorie_id ( qui est une clef étrangère) est bien chargé. J’ai
regénérer
le model avec script/generate scaffold recipe

undefined local variable or method `value’ for #<#Class:0x24a96d0:0x24a96a8>

il faut remplacer value par la valeur que tu veux mettre en fait…

on peut mettre un condition un peut comme ca ? { :selected => if
category.id== @
recipe.category_id}

Peux tu verifier que tu declares bien ton instance recipes ? cela doit
etre
un @recipe dans ton action. Verifie bien.

dans mon action def edit ?

recipes_controller.rb
def edit
@recipe = Recipe.find(params[:id])
@categories = Category.find_all
end

category.rb
class Category < ActiveRecord::Base
has_many :recipes
end

recipes.rb
class Recipe < ActiveRecord::Base
belongs_to :category
end


ekinox

  • Premiere chose:
    ton model doit s’appeler recipe.rb (au singulier) et non recipes.rb =>
    convention RoR

  • Deuxiemement:

ton action est correct, le nom est bien @recipe (au singulier)
def edit
@recipe = Recipe.find(params[:id])
@categories = Category.find_all
end

maintenant dans ta vue (edit.rhtml): tu dois avoir le champ category:

<%= select(‘recipe’, ‘category_id’, Category.find_all.collect {|c| [
c.nom, c.id ] }) %>

remarque que j’ai change par rapport a ton instruction initiale:
recipes en recipe et category.id en category_id.

Je pense que cela devrait marcher maintenant.
courage

Did

2006/4/25, Bolo [email protected]:

Bolo a écrit :

voila ca marche. Je pense que loco doit avoir un chack car j’ai du
redémarrer l’application pour que ca marche :frowning:

Tu peux redonner la syntaxe exacte de ton select avec la condition ?

tu travailles sous quel environnement: test, development, production ?
Parce qu’avec les env de test et prod, les classes sont cachees
(options: config.cache_classes = true dans config/environments/test):
ce qui veut dire que meme si tu fais une modifs sur les controllers
par exemple, elles ne seront pas prises en compte sauf si tu
redemarres le serveur d’appli.

2006/4/26, Bolo [email protected]:

je n’ai pas eu besoin de mettre de condition
comme le disait plus tôt

si tu as bien initialise (charge ?) ton object Recipe, le
“selected=selected” doit etre ajoute sur la bonne option.
si ton object n’est pas encore present dans la base de donnee
(equivelent a l’action new dans le scaffold) et que tu veux
positionner une valeur par defaut, tu peux faire, au niveau de
l’action, un:
@recipe = Recipe.new(:category_id => )

quand l’objet est bien initailisé , le selected se place tout seul. Je
sais
pas pkoi mais j’ai du redémarer loco pour que l’objet recipe s’intialise
correctement

env est par defaut en principe
sinon c’est “echo $RAILS_ENV” (unix) pour savoir.
Mais c’est vrai quelque fois que le serveur RoR plante grave (c’est
rare mais cela m’est deja arrive) !

2006/4/26, Bolo [email protected]:

tu travailles sous quel environnement: test, development, production ?

Parce qu’avec les env de test et prod, les classes sont cachees
(options: config.cache_classes = true dans config/environments/test):
ce qui veut dire que meme si tu fais une modifs sur les controllers
par exemple, elles ne seront pas prises en compte sauf si tu
redemarres le serveur d’appli.

et comment je peux savoir sur quel environement je travaille ? Si on ne
touche a rien( ceque je fais toujours :slight_smile: Ce n’est pas défaut
developement ?

tu travailles avec loco ?

2006/4/26, didier lafforgue [email protected]:

non !

2006/4/26, Bolo [email protected]: