2009-08-20 6 views
1

lecture avec le livre agile, il dit ceci dans une note:Comment puis-je obtenir mes valeurs de table de consultation dans une zone de sélection?

... Vous passez simplement l'assistant, sélectionnez le résultat de faire un fi e (: tous) sur votre table de consultation .

D'accord ...

<%= f.select :source, Source.find(:all) %> 

Mon contrôleur de source (et donc la table) ressemble à ceci:

create_table :sources do |t| 
    t.string :source 

    t.timestamps 
end 

Mais ma boîte de sélection est un gâchis, je reçois ce type de données dans toutes les valeurs et les affichages:

#<Source:0x23a2bfc> 

J'ai donc essayé de faire un Source.find(:all, :select => 'name,id') mais ça me donne toujours des trucs bizarres.

Qu'est-ce que je fais mal?

Répondre

3
Source.find(:all) 

retournera un tableau d'objets Source - ce n'est pas ce que vous voulez. Ce que vous voulez, c'est un éventail d'options. Quelque chose comme :

select(:source, "source_id", Source.all.collect {|p| [ p.source, p.id ] }) 
+0

Merci, fonctionne parfaitement. Je savais qu'il y avait quelque chose que je devais faire comme ça ... quelle est la différence entre .collect et .map? –

+0

Il n'y a pas de différence. 'map' est un alias pour' collect'. –

3

Vous devez passer une collection d'options (ou options clé-valeur). Le troisième paramètre dans select est effectivement passé à la méthode options_for_select. Ceci est mieux illustré avec un exemple.

options_for_select(["a", "b"]) 

... devient

<option>a</option><option>b</option> 

La plupart du temps, vous serez plus intéressé par paires clé-valeur

options_for_select([["a", "1"], ["b", "2"]]) 

... devient

<option value="1">a</option><option value="2">b</option> 

Comme une main courte, il est courant de passer une collecte complète ion des objets et les mapper pour se conformer à ce que options_for_select attend.

options_for_select(Model.all.map { |m| [m.attr1, m.attr2] }) 

... et pour répondre à votre question en utilisant la méthode select à l'intérieur d'une vue

<%= f.select(:method, Model.all.map { |m| [m.attr1, m.attr2] }) %> 
+0

Merci pour l'explication. J'aurais marqué les deux comme des réponses si je pouvais parce qu'ils font la même chose. –

Questions connexes