2009-03-30 10 views
12

E 'possibile aggiungere uno <option> alla fine di uno <select> creato con il metodo helper collection_select?Il metodo helper collection_select di Rails e l'opzione "Create item" alla fine

In questo momento ho

f.collection_select(:category_id , @categories, :id, :name, {:prompt => 'Please select a category'}) 

che genera

<select id="product_category_id" name="product[category_id]"> 
    <option value="">Please select a category</option> 
    <option value="7">category one</option> 
    <option value="8">category 2</option> 
</select> 

e quello che vorrei è

<select id="product_category_id" name="product[category_id]"> 
    <option value="">Please select a category</option> 
    <option value="7">category one</option> 
    <option value="8">category 2</option> 
    <option value="new">..or create a new one</option> 
</select> 

Questo è possibile o devo solo ciclo attraverso la raccolta e generare le opzioni manualmente?

risposta

11

Probabilmente si dovrebbe usare select.

Come così:

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [ [ 'Or create a new one', 'new' ] ], {:include_blank => 'Please select a category'}) 

Buona fortuna!

+0

umm .. questo crea 2 opzioni extra, entrambe con nome uguale a valore, "O creane una nuova" e "nuova" – andi

+0

I anche provato con un hash invece di un array, Hash ["nome", "creane uno nuovo", "id", "nuovo"], ma ottengo un "impossibile convertire Hash in array" .. figure .. – andi

+0

quindi .. questo dovrebbe essere, ma, qualche idea su come impostare un valore diverso dal testo all'interno dell'opzione? – andi

0

Risposta breve: no.

Risposta lunga: certo, ma devi essere furbo.

  • Creare una classe in questo modo:

    class New_option_placeholder 
        def id 
        "new" 
        end 
    
        def name 
        "...or create a new one" 
        end 
    end 
    
  • Invece di passare @categories, passare @categories+New_option_placeholder.new

Se (come indicato dai commenti) siete alla ricerca di qualcosa di terser è possibile require "ostruct" e quindi passare @categories + [OpenStruct.new(:id => 'new',:name => '...or create a new one')] per realizzare essenzialmente lo stesso questo.

+0

Questo probabilmente funzionerebbe, ma è troppo di una soluzione, quindi penso che andrò per la soluzione di Gdeglin.+1 ancora perche 'fa quello che volevo – andi

+0

Penso che quando avremo la soluzione di Gdeglin funzionante avrai qualcosa con più parti mobili di questo. Se stai cercando una versione a una sola riga, ne aggiungo uno ... – MarkusQ

3

convenuto sulla risposta breve No e risposta lunga "Be Crafty", ma qui è quello che ho appena fatto che credo sia più semplice di una di queste due soluzioni e ha lavorato per me:

Avvolgere la prossima linea interna erb tag cioè <%= e %>:

f.collection_select :advertisement_group_id, AdvertisementGroup.find(:all, :order => "name DESC") << AdvertisementGroup.new(:name => "New Group"), :id, :name, :include_blank => true 

basta creare un nuovo oggetto con .new e passare in qualsiasi testo che si desidera visualizzare con :include_blank => true.

1

Non posso commentare altrimenti aggiungo questo alla risposta sopra.

Per ottenere risultati Option-> valore di "nuovo", "o crearne uno nuovo" .. invece di

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + ['Or create a new one','new'], {:include_blank => 'Please select a category'}) 

fare

f.select(:category_id, @categories.collect {|p| [ p.name, p.id ] } + [['Or create a new one','new']], {:include_blank => 'Please select a category'}) 

nota l'extra [] intorno alle opzioni. Questo fa funzionare la matrice come opzione, coppia di valori

Problemi correlati