Rails select helper - Valor padrão selecionado, como?

182

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?

totocaster
fonte
Não sei se você deseja selecionar um projeto padrão quando a página é carregada, se: project_id não está definido ou se deseja retornar o valor da seleção no hash dos parâmetros como: pid.
Tilendor 31/03/09

Respostas:

223

Isso deve servir:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
fonte
5
sem parâmetros, options_for_selecté o melhor caminho. É bom para qualquer situação, bom para edição de formulários também.
Adriano Resende
Aqui está a CHAVE: OLHE para a sua função (options_for_select () vs f.select. Lembre-se de que estas são funções diferentes
#
126

Use o atributo correto da instância atual (por exemplo @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
lince
fonte
4
Esta é a melhor resposta, porque também funciona select_tag. Obrigado, isso realmente me ajudou também.
stephenmurdoch
7
Além disso, você pode tentaroptions_for_select(..., f.object.project_id )
ago /
Muito obrigado! Todas as outras respostas aceitas não dizem como selecionar via variável.
Mike Belanger
52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
fonte
Eu não conseguia descobrir esta solução para fora até que eu notei o seu colchete de fechamento em torno da matriz valores ANTES a vírgula que separa o seu valor padrão ... eu perdi este suporte aquivalue3], default
BigRon
33

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.fielduse sempre f.objecto nome do campo ao final.

Mike Bethany
fonte
3
Essa é uma solução limpa e, como mencionado, você deseja definir o valor padrão apenas em novo e o valor atual em edição.
count0
1
Eu sei que esse é um thread antigo, mas para quem pode se deparar com ele, esta resposta também funciona com o select2plugin 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.
cdouble.bhuck
Acho que esse deve ser o aceito como resposta, como o Mike Bethany disse que todas as outras respostas assumem que o formulário é renderizado apenas para novos registros quando a abordagem rails é reutilizar o formulário. Kudos Mike
Erick Castrillo
22

Tente o seguinte:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
gavit
fonte
Usando o Rails 4, o params[:pid]não funcionou, mas o seu exemplo funcionou.
Eric Wanchic
Isso funcionou para mim, pois estou usando um parcial dentro de "f.fields_for" Obrigado.
27413 Hugo
11

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

danengle
fonte
Essa resposta me ajudou a identificar meu problema. Minha caixa de seleção é dinâmica e puxa uma coleção do banco de dados. Eu estava tentando preencher a seleção padrão por um título, não por um ID do item. Essa resposta me ajudou a ver esse problema e, depois de preencher minha @projectvariá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.selectajudante: selected: @projectObrigado @danengle
Christopher Warrington
10

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?
totocaster
fonte
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
fonte
3

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}
Shelvacu
fonte
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
fonte
0

Como alternativa, você pode definir o atributo: project_id no controlador, pois o primeiro argumento do f.select puxa esse atributo específico.

promacuser
fonte
0

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 
user2480972
fonte
0

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' %>
shiva kumar
fonte
0

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
random_user_0891
fonte
-2

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] } %>
epochwolf
fonte
mas não vai selecionar o item apropriado no select: S
totocaster