Simple on Rails – Carregando dropdowns dinamicamente

13 de abril de 2007  |  Ruby on Rails  | 

Recentemente tive de encontrar uma solução para um problema simples: eu tinha uma lista de estados e cidades em dropdowns. A intenção é que a lista de cidades fosse carregada de acordo com o estado selecionado. Simples.

Como estou começando com o Rails, procurei na internet por alguma dica para fazer isto. Encontrei diversos sites descrevendo o passo-a-passo para a solução. Entre alguns deles os blogs do Eustáquio e do André Ribeiro.

Achei a solução apresentada por eles muito confusa e com muito código.

Mas uma coisa que me chamou atenção foi o seguinte comentário:

Vamos utilizar alguma técnica mais atual, que tal um pouco de AJAX… é relativamente fácil implementar isso com Rails, normalmente carregaríamos um fragmento de HTML que implementa o campo através de uma requisição AJAX enganchada no método onchange do drop-down.

Mas esta técnica é tão… antiga.

Antiga? Não entendi. Para mim antiga é a roda, e eu não pretendo inventá-la de novo.

Sempre existe mais de uma solução para o mesmo problema, e a melhor é sempre a mais simples.

Depois de ler isto, resolvi tentar fazer do meu jeito:

Inclui um observe_field na minha view:
[source:ruby]<span id=”select_cidades”></span>
<%= observe_field :job_state,
:url => { :action => ‘carrega_cidades’ },
:update => ‘form_cidade’,
:with => ‘form_estado’,
:complete => “visual_effect(:highlight, ‘td_cidades’)” %>[/source]
E no meu controller:
[source:ruby]def carrega_cidades
@cities = City.find(:all,
:conditions => “state_id = #{params[:job_state]}”,
:order => ‘nome’)
render :inline =>
“<%= collection_select(‘job’, ‘city_id’ , @cities, ‘id’, ‘nome’) %>”
end[/source]
Funciona!

Não se esqueça porque você decidiu aprender rails.


5 Comentários


  1. Maravilhoso Carlos, vc falou tudo aqui:

    “Não se esqueça porque você decidiu aprender rails.”

    Um abraço.

  2. Dá para você postar a sua view aí para a gente dar uma olhada? :-)

  3. Às vezes a gente esquece um post antigo e acha ele de novo …

    Só lembrando que se você remover e inserir novamente um elemento que tenha algum “trigger”, não vai funcionar. Se você preencher o estado através da seleção do país removendo e inserindo o elemento do estado, que sendo alterado carregaria as cidades, vai dar problema a não ser que no momento de inserção do elemento novo você restaure os “triggers”. E aí vai ter que escrever mais um pouquinho de código. ;-)

  4. opa desculpa encomodar mas estou com um probleminha aqui no meus projetos tenho duas tabelas clientes pedidos dentro da tabela pedido tem um cliente eu preciso buscar o cliente pelo codigo por exemplo ele digita o codigo da um tab e ele me traz o cliente pertecente ao codigo digitado, sem ter um select porque se nao ficaria muito grande o select nao sei se seria pedir de mais pedir um exemplo uma luz algo

    muito obrigado pela atencao

Deixe um comentário