Rails: Pré-seleccionar um valor no ActionView-Helper 'collection_select'
-
06-07-2019 - |
Pergunta
Eu estou tentando obter a ActionView-Helper collection_select
tomar um valor que será pré-selecionado no menu suspenso.
Nem (:selected
no html-opção por hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected => @my_collection_object.id}) %>
nem (:selected
na opção de hash)
<%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {:selected => @my_collection_object.id}, {}) %>
parecem funcionar.
O que estou fazendo de errado? Alguém pode me ajudar em um presente?
Solução
A partir da docs :
Exemplo de uso (seleccionando o Author
associado para um exemplo de Post
, @post
):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial)
Se @post.author_id
já é 1, este voltaria:
<select name="post[author_id]">
<option value="">Please select</option>
<option value="1" selected="selected">D. Heinemeier Hansson</option>
<option value="2">D. Thomas</option>
<option value="3">M. Clark</option>
</select>
Então você só precisa ter certeza de que @my_object.my_method
retorna um valor que corresponde a um dos valores de opção disponíveis. Se há um jogo, então essa opção será selecionada.
Outras dicas
De acordo com a docs , se @my_object.my_method
tem a mesmo valor que uma das opções, que um será selecionado por padrão.
Por outro lado, você pode tentar usar options_from_collection_for_select
em conjunto com select_tag
:
<%= select_tag 'my_object[my_method]', options_from_collection_for_select(@my_collection, :id, :description_string, @my_collection_object.id) %>
Use :selected_value
%= collection_select(:my_object, :my_method, @my_collection, :id, :description_string, {}, {:selected_value => @my_collection_object.id}) %>
Verifique se @ retornos my_object.my_method nulo. Se isso acontecer,
Se chamar o método retorna nil, nenhuma seleção é feita sem incluir: alerta ou: include_blank no hash opções.
Além disso, você pode tentar usar lambda, como no exemplo rdoc
{:disabled => lambda {|category| category.archived? }
No seu caso este será semelhante
{:selected => lambda {|obj| obj.id == @my_collection_object.id }}
Ele também funciona se sua coleção é na forma de uma matriz de matrizes 2 de valor:
CURRENCIES = [["USD", "$"], ["BRL", "R$"]]
<%= collection_select :thing, :currency, CURRENCIES, :first, :last %>
O :first
e truque :last
funciona muito bem para estas coisas, sem ter que definir um modelo separado para eles.