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?
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?
Risposte:
Questo dovrebbe farlo:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
è il modo migliore. È buono per ogni situazione, buono anche per la modifica dei moduli.
Usa l'attributo giusto dell'istanza corrente (ad es. @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
anche con . Grazie anche a me ha aiutato molto.
options_for_select(..., f.object.project_id )
Rotaie 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
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.field
te, usa sempre f.object
quindi aggiungi il nome del tuo campo alla fine.
select2
plugin JS. Funziona perfettamente se stai creando o modificando record con lo stesso modulo e usando select2, in particolare con il testo segnaposto.
Prova questo:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
non ha funzionato, ma il tuo esempio ha funzionato.
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
@project
variabile con un ID dalla tabella del database, anziché un titolo, questo codice ha funzionato aggiunto sul retro dell'helper form.select
: selected: @project
Grazie @danengle
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?
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}
In alternativa, è possibile impostare l'attributo: project_id nel controller, poiché il primo argomento di f.select estrae quel particolare attributo.
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
È 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' %>
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
Questo dovrebbe funzionare per te. Passa semplicemente {:value => params[:pid] }
alla variabile html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>