2010-09-04 6 views
11

ho bisogno di passare una colletta per la selezione ingresso standard Formtastic:Come passare correttamente la raccolta per l'ingresso in Formtastic

f.input :apple, :as => :select, :collection => Apple.all 

Il problema è, però che ho bisogno Formtastic per accedere a un metodo diverso rispetto nome. Ora questo è davvero un problema. Posso sempre passare la matrice

f.input :apple, :as => :select, :collection => Apple.map { |a| a.format_name } 

Il problema è che dopo questo otterrò stringhe nel controllore invece di ID che non è desiderato. Ho cercato di passare Hash invece:

options = Hash.new 
Apple.each { |a| Apple.store(a.format_name, a.id) } 
f.input :apple, :as => :select, :collection => options 

Ora il problema è, che da quando sto usando rubino 1.8.7, l'ordine Hash non è specificato e io, naturalmente bisogno ordinato ingresso ...

posso immagina alcune soluzioni, ma tutte richiedono codice non necessario.

Qualche idea su come risolvere questo diritto?

risposta

15

Prova:

f.input :apple, :as => :select, :collection => Apple.all, :label_method => :format_name, :value_method => :id 
+0

cosa succede se vogliamo non solo: format_name, ma smth in questo modo:: format_name +: another_name? – kokemomuke

4

Non v'è alcuna indicazione diretta nella documentazione Formtastic, ma la raccolta può essere nidificato array e, in modo problema è risolto da:

f.input :apple, :as => :select, :collection => Apple.map { |a| [ a.format_name, a.id ] } 
+0

Questo ha fatto il trucco per me visto che mi capita di utilizzare ancora una versione di Ruby 1.8.7. Grazie! – shakerlxxv

0

Questo è il modo corretto ora:

f.input :apple, 
     as: :select, 
     collection: Apple.pluck(:format_name, :id) 

Questo imposta collection a una matrice di [nome, id] tuple. Facile!

modo Presto-essere obsoleto:

Utilizzare l'opzione member_label, ad esempio

f.input :apple, 
     as: :select, 
     collection: Apple.all, 
     member_label: :format_name 

La documentazione è here in a code comment.

Problemi correlati