2009-08-20 5 views
1

zusammen mit dem agilen Buch zu lesen, sagt er dies in einer Fußnote:Wie erhalte ich meine Werte in einer Auswahlbox?

... Sie einfach den SELECT-Helfer ein fi nd tun gibt das Ergebnis (: alle) auf Ihrem Nachschlag Tabelle.

Okay ...

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

Meine Quellensteuerung (und damit Tabelle) sieht wie folgt aus:

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

    t.timestamps 
end 

Aber mein Auswahlbox ist ein Chaos, erhalte ich diese Art von Daten in allen Werten und Anzeigen:

#<Source:0x23a2bfc> 

Also habe ich versucht, eine 012 zu tunaber das gibt mir immer noch die wahnsinnig aussehenden Sachen.

Was mache ich falsch?

Antwort

3
Source.find(:all) 

wird ein Array von Source-Objekten zurückgeben - das ist nicht was Sie wollen. Was Sie wollen, ist eine Reihe von Optionen. Etwas wie:

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

Dank. Ich wusste, dass ich so etwas tun musste ... was ist der Unterschied zwischen .collect und .map? –

+0

Es gibt keinen Unterschied. 'map' ist ein Alias ​​für' collect'. –

3

Sie benötigen eine Sammlung von Optionen zu übergeben (oder Schlüssel-Wert-Optionen). Der dritte Parameter in select wird tatsächlich an die Methode options_for_select übergeben. Dies wird am besten anhand eines Beispiels veranschaulicht.

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

... wird

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

Die meiste Zeit Sie

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

...

<option value="1">a</option><option value="2">b</option> 
in Schlüssel-Wert-Paare mehr daran interessiert sein werden wird

Als Short-Hand ist es üblich, eine ganze Sammlung zu übergeben ionen von Objekten und bilden sie ab, um dem zu entsprechen, was options_for_select erwartet.

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

... und Ihre Frage mit der select Methode zu beantworten, perfekt funktioniert innerhalb einer Ansicht

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

Vielen Dank für die Erklärung. Ich hätte beide als Antworten markiert, wenn ich könnte, da sie dasselbe tun. –

Verwandte Themen