Aqui está um pedaço de código que estou usando agora:
<%= f.select :project_id, @project_select %>
Como modificá-lo para tornar seu valor padrão igual a params[:pid]
quando a página é carregada?
Aqui está um pedaço de código que estou usando agora:
<%= f.select :project_id, @project_select %>
Como modificá-lo para tornar seu valor padrão igual a params[:pid]
quando a página é carregada?
Respostas:
Isso deve servir:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
é o melhor caminho. É bom para qualquer situação, bom para edição de formulários também.
Use o atributo correto da instância atual (por exemplo @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
. Obrigado, isso realmente me ajudou também.
options_for_select(..., f.object.project_id )
Rails 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
O problema com todas essas respostas é que elas definem o campo para o valor padrão, mesmo se você estiver tentando editar seu registro.
Você precisa definir o padrão para o valor existente e, em seguida, única configurá-lo para o padrão atual, se você não tem um valor. Igual a:
f.select :field, options_for_select(value_array, f.object.field || default_value)
Para quem não conhece, f.object.field
use sempre f.object
o nome do campo ao final.
select2
plugin JS. Funciona perfeitamente se você estiver criando ou editando registros com o mesmo formulário e usando select2, especialmente com texto de espaço reservado.
Tente o seguinte:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
não funcionou, mas o seu exemplo funcionou.
se params [: pid] for uma string, que se vier de um formulário, provavelmente precisará usar
params[:pid].to_i
para que o item correto seja selecionado na lista de seleção
@project
variável com um ID da tabela do banco de dados, em vez de um título, esse código funcionou anexado à parte de trás do form.select
ajudante: selected: @project
Obrigado @danengle
Encontrei solução e descobri que sou bastante inexperiente no RoR.
Dentro do controlador que gerencia a vista descrita acima, adicione isto:
@work.project_id = params[:pid] unless params[:pid].nil?
Não consegui fazer isso funcionar e descobri que precisava adicionar o atributo html "selecionado" não apenas à <option>
tag correta, mas também à <select>
tag. Os documentos da MDN sobre o atributo selecionado da tag select dizem:
selected - O atributo booleano indica que uma opção específica pode ser selecionada inicialmente.
Isso significa que o código deve se parecer com:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Como alternativa, você pode definir o atributo: project_id no controlador, pois o primeiro argumento do f.select puxa esse atributo específico.
Se tentar imprimir o objeto f, você verá que há f.object que pode ser analisado para obter o item selecionado (aplicável a todas as versões do Rails> 2.3)
logger.warn("f #{f.object.inspect}")
portanto, use o seguinte script para obter a opção selecionada apropriada:
:selected => f.object.your_field
Já está explicado, tentarei dar um exemplo
deixe a lista de seleção ser
select_list = { eligible: 1, ineligible: 0 }
Portanto, o código a seguir resulta em
<%= f.select :to_vote, select_list %>
<select name="to_vote" id="to_vote">
<option value="1">eligible</option>
<option value="0">ineligible</option>
</select>
Então, para fazer uma opção selecionada por padrão, temos que usar selecionado: valor .
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
se can_vote? retorna true, ele define selected: 1 e o primeiro valor será selecionado em outro segundo.
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 as opções de seleção são apenas uma lista de matrizes em vez de hast, o selecionado será apenas o valor a ser selecionado, por exemplo, se
select_list = [ 'eligible', 'ineligible' ]
agora o selecionado levará apenas
<%= f.select :to_vote, select_list, selected: 'ineligible' %>
A resposta de Mike Bethany acima trabalhou para definir um valor padrão quando um novo registro estava sendo criado e ainda tem o valor que o usuário selecionado mostra no formulário de edição. No entanto, adicionei uma validação de modelo e ela não me permitiu enviar o formulário. Aqui está o que funcionou para mim: ter uma validação de modelo em campo e mostrar um valor padrão, bem como o valor que o usuário selecionou no modo de edição.
<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>
validação do modelo
validates :project_id, presence: true
Isso deve funcionar para você. Apenas passa {:value => params[:pid] }
para a variável html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>