Assistente selezione rotaie - Valore selezionato predefinito, come?


182

Ecco un pezzo di codice che sto usando ora:

<%= f.select :project_id, @project_select %>

Come modificarlo per rendere il suo valore predefinito uguale a params[:pid]quando viene caricata la pagina?


Non sono sicuro se si desidera selezionare un progetto predefinito quando la pagina viene caricata, se: project_id non è impostato o se si desidera restituire il valore della selezione nell'hash params come: pid.
Tilendor

Risposte:


223

Questo dovrebbe farlo:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

5
senza parametri, options_for_selectè il modo migliore. È buono per ogni situazione, buono anche per la modifica dei moduli.
Adriano Resende,

Ecco il CHIAVE: GUARDA la tua funzione (options_for_select () vs f.select. Ricorda che queste sono funzioni diverse.
FlyingV

126

Usa l'attributo giusto dell'istanza corrente (ad es. @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
Questa è la risposta migliore perché funziona select_taganche con . Grazie anche a me ha aiutato molto.
Stephenmurdoch,

7
Inoltre puoi provareoptions_for_select(..., f.object.project_id )
1815

Grazie mille! Tutte le altre risposte accettate non dicono come selezionare tramite variabile.
Mike Belanger,

52

Rotaie 3.0.9

select options_for_select([value1, value2, value3], default)

Non sono riuscito a capire questa soluzione finché non ho notato la tua parentesi di chiusura attorno alla matrice di valori PRIMA della virgola che separa il tuo valore predefinito ... Ho perso questa parentesi quivalue3], default
BigRon

33

Il problema con tutte queste risposte è che impostano il campo sul valore predefinito anche se si sta tentando di modificare il record.

È necessario impostare il valore di default per il vostro valore esistente e quindi solo impostarlo sul valore predefinito effettivo se non si dispone di un valore. Così:

f.select :field, options_for_select(value_array, f.object.field || default_value)

Per chiunque non abbia familiarità con f.object.fieldte, usa sempre f.objectquindi aggiungi il nome del tuo campo alla fine.


3
Questa è una soluzione pulita e, come detto, vuoi impostare il valore predefinito solo su nuovo e il valore corrente su modifica.
contare il

1
So che questo è un vecchio thread, ma per chiunque possa trovarlo, questa risposta funziona anche con il select2plugin JS. Funziona perfettamente se stai creando o modificando record con lo stesso modulo e usando select2, in particolare con il testo segnaposto.
cdouble.bhuck,

Penso che questo dovrebbe essere quello accettato come Risposta, come @Mike Bethany ha detto che tutte le altre risposte presuppongono che il modulo sia reso solo per i nuovi record quando l'approccio rails deve riutilizzare il modulo. Kudos Mike
Erick Castrillo,

22

Prova questo:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

Usando Rails 4, params[:pid]non ha funzionato, ma il tuo esempio ha funzionato.
Eric Wanchic,

Questo ha funzionato per me dato che sto usando un parziale all'interno di "f.fields_for" Grazie.
Hugo,

11

se params [: pid] è una stringa, che se proviene da un modulo, probabilmente lo dovrai usare

params[:pid].to_i  

per l'elemento corretto da selezionare nell'elenco di selezione


Questa risposta mi ha aiutato a individuare il mio problema. La mia casella di selezione è dinamica e estrae una raccolta dal database. Stavo cercando di popolare la selezione predefinita per titolo, non per un ID dell'oggetto. Questa risposta mi ha aiutato a vedere quel problema, e una volta che ho popolato la mia @projectvariabile con un ID dalla tabella del database, anziché un titolo, questo codice ha funzionato aggiunto sul retro dell'helper form.select: selected: @projectGrazie @danengle
Christopher Warrington il

10

Ho trovato una soluzione e ho scoperto che sono abbastanza inesperto in RoR.

All'interno del controller che gestisce la vista sopra descritta aggiungi questo:

@work.project_id = params[:pid] unless params[:pid].nil?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

3

Non sono riuscito a farlo funzionare e ho scoperto che dovevo aggiungere l'attributo html "selezionato" non solo al <option>tag corretto ma anche al <select>tag. I documenti di MDN sull'attributo selezionato del tag select dicono:

selezionato : l'attributo booleano indica che inizialmente è possibile selezionare un'opzione specifica.

Ciò significa che il codice dovrebbe apparire come:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}

2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

0

In alternativa, è possibile impostare l'attributo: project_id nel controller, poiché il primo argomento di f.select estrae quel particolare attributo.


0

Se provi a stampare l'oggetto f, vedrai che c'è un oggetto f che può essere sondato per ottenere l'elemento selezionato (applicabile per tutte le versioni di binari> 2.3)

logger.warn("f #{f.object.inspect}")

quindi, utilizzare il seguente script per ottenere l'opzione selezionata corretta:

:selected => f.object.your_field 

0

È già spiegato, proverò a fare un esempio

lascia che sia l'elenco selezionato

select_list = { eligible: 1, ineligible: 0 }

Quindi il seguente codice risulta

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

Quindi per fare un'opzione selezionata per impostazione predefinita dobbiamo usare selected: value .

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

if can_vote? ritorna vero imposta set selezionato: 1 quindi il primo valore verrà selezionato altrimenti secondo.

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

se le opzioni selezionate sono solo un elenco di array invece di hast, il selezionato sarà solo il valore da selezionare, ad esempio se

select_list = [ 'eligible', 'ineligible' ]

ora il selezionato prenderà semplicemente

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

La risposta di Mike Bethany sopra ha funzionato per impostare un valore predefinito quando veniva creato un nuovo record e avere ancora il valore che l'utente selezionato mostra nel modulo di modifica. Tuttavia, ho aggiunto una convalida del modello e non mi consente di inviare il modulo. Ecco cosa ha funzionato per me per avere una validazione del modello sul campo e mostrare un valore predefinito e il valore selezionato dall'utente in modalità di modifica.

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

validazione del modello

  validates :project_id, presence: true

-2

Questo dovrebbe funzionare per te. Passa semplicemente {:value => params[:pid] }alla variabile html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

ma non selezionerà l'elemento appropriato in select: S
totocaster
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.