Receita para um formulário com busca de cep à la Rails :p

Ingredientes:

  • Brazilian-rails
  • Jquery
  • Ruby-json

Modo de preparo:

Coloque uma porção generosa de utilitários que facilitam o dia a dia de nos Brasileiros em seu caldeirão Rails:

> gem --install brazilian-rails

“O gem brazilian-rails possui vários ingredientes para temperar a sua aplicação, mas no momento vamos nos concentrar na busca por cep. Você pode saber mais sobre o brazilian-rails no site da improve It.”

Em seguida acrescente uma medida de ruby-json:

> gem –install ruby-json

“O ruby-json é um utilitário para serializar as suas classes ruby para os padrões Json.”

Só para lembrar vamos utilizar Jquery também, mas isso já é um ingrediente padrão em qualquer receita Web sua, certo?
Não?? Como assim? Você ainda não utiliza JQuery? putz.. tsc.. tsc..
Se você ainda não usa, chegou a hora. http://jquery.com/ Instale na pasta /public/javascript na estrutura de diretórios do seu projeto Rails.

(Pretendo colocar alguns tutoriais de Jquery aqui no blog em breve ou nem tão breve assim rs.. “O blog é meu e eu post a hora que eu quiser hahahaa!”)

Bom, agora que temos todos os ingredientes necessários em seus devidos lugares, deixe eles cozinhando em quanto preparamos o nosso prato.

No controller, vamos criar um método para fazer a busca do cep e retornar o resultado para o cliente utilizando Json.
Você já tem o seu formulário pronto né? (model, view, controller)

Não??
**##%%!!
Você só quer moleza em? :p

Quer tudo na mão! ok ok vou fazer do zero, mas vê se presta atenção nessa porra e não vai só copiar e colar o código, pois é tão fácil que até comigo explicando você vai entender hehehe!

Vamos criar um controller:

 > script/generate controller enderecos

Em seguida edite o seu controller enderecos_controller.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#classe do utilitario para serializar as classes ruby para o padrão json
require 'json/objects'
 
  def localizar_endereco
      retorno = 1
      # Classe do brazilian-rails responsavél pela busca de endereco.
      @endereco = BuscaEndereco.por_cep params[:cep]
      endereco = @endereco.fetch(0)
      numero = @endereco.fetch(1)
      bairro = @endereco.fetch(2)
      estado = @endereco.fetch(3)
      cidade = @endereco.fetch(4)
     rescue
        retorno = 0
     ensure
        # preste atenção nesse bloco e veja como é dificil serializar um objeto JSon no Ruby
        # objeto = {:nome do atributo => valor do atributo}
        data = {:retorno => retorno, :endereco => endereco,
                :bairro => bairro, :cidade => cidade, :estado => estado}
    render :text => data.to_json  #aqui acontece a mágica!
  end

Vamos criar um formulário para testar a nosso busca:
Crie um arquivo /app/views/enderecos/index.html.erb e logo depois da tag “html” insira o código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  <!-- Arquivo do framework jquery -->
  <script src="/javascripts/jquery.js" type="text/javascript"></script>
  Busca de endereço por cep
<!-- Aqui vai o nosso código utilizando Jquery -->
<script type="text/javascript">
$(document).ready(function() {
 
 $("#btncep").click(function(){
    if ($.trim(endereco_cep.value) != "") { 
    <!-- Aqui é uma firula, para o usuário não achar que não esta acontecendo nada-->
      $("#lbcep").html(" Pesquisando cep...")
	<!-- função do JQuery que Recebe o objeto serializado via ajax. -->
        <!-- Ta vendo como o JQuery é foda? -->
      $.getJSON("/enderecos/localizar_endereco", { cep: $("#endereco_cep").val()},function(json){
      <!-- Atribuindo os valores para os componentes da página-->
	if (json.retorno == 1) {
	   $("#endereco_endereco").val(json.endereco);
	   $("#endereco_bairro").val(json.bairro);
	   $("#endereco_cidade").val(json.cidade);
	   $("#endereco_estado").val(json.estado);
	   $("#endereco_numero").focus();
	   } else {
	      alert("Cep não encontrado.");
	   }
	   $("#lbcep").html(" cep:")});
	} 
	else {
		alert("Informe um cep.");
	}
});
});
</script>

Agora vamos colocar o código do formulário no “body” da nossa página:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<body>
<form id="frmBuscaCep" >
  <fieldset>
    <legend>Endereço</legend>
    <table>
      <tr><td>
	<label for="endereco_cep" id="lbcep"> cep:</label><br />
	<input type="text" id="endereco_cep" name="endereco[cep]" size="12" />
	<a id="btncep" href="#"> Pesquisar Cep</a><span id="msgbuscacep"></span>
      </td></tr>
     <tr><td>
	<label for="endereco_endereco"> endereco:</label><br />
	<input type="text" id="endereco_endereco" name="endereco[endereco]" size="50" />
     </td><td>
	<label for="endereco_numero"> numero:</label><br />
	<input type="text" id="endereco_numero" name="endereco[numero]" size="10" />			  
     </td></tr>
   </table>	
   <table>	
     <tr><td>
	<label for="endereco_bairro"> bairro:</label><br />
	<input type="text" id="endereco_bairro" name="endereco[bairro]" size="20" />
     </td><td>
	<label for="endereco_cidade"> cidade:</label><br />
	<input type="text" id="endereco_cidade" name="endereco[cidade]" size="20" />
     </td><td>
	<label for="endereco_estado"> estado:</label><br />
	<input type="text" id="endereco_estado" name="endereco[estado]" size="5" />
     </td></tr>
   </table> 
 </fieldset>
</form>
</body>

Ufa!! terminamos :)
Agora é só iniciar o seu servidor:

 >> script/server 

e acessar o endereço: http://localhost:3000/enderecos
E ai funcionou?


..
Não?? como assim? vc acompanhou o tutorial todo?
#!**#$!!!
Eu falei para você não ficar só copiando e colando o código….

HAHHAAA!! brincadeira, ainda falta um pequeno detalhe ;)
edite o arquivo: config/environment.rb

1
2
3
4
5
  if Rails::VERSION::STRING > '2.0.2'
    config.gem 'brazilian-rails'
  else
    require 'brazilian-rails'
  end

Agora sim é só testar!

Abraço!
Iuri

  1. Márcio says:

    ó, adicionei vcs no meu blog tb hein.
    meu blog vai falar nada de porra nenhuma, mas é só pra passar o tempo …. heheheh

  2. RYErnest says:

    Nice post u have here :D Added to my RSS reader

  3. Ricardo Leme says:

    Inicialmente, parabéns pelo post!
    Eu tentei o passo a passo e infelizmente não funcionou. :(
    Agora pintou algumas dúvidas: Como é que o método localizar_endereco está sendo chamado a partir do controller enderecos?
    A linha vai
    $.getJSON(“/enderecos/localizar_endereco”… vai fazer o que?

    Eu tentei colocar fixo um cep em um novo link e aí ele está retornando o objeto serializado…

    “enderecos”,:action => :localizar_endereco, :cep => “13310200″ %>

    Valeu!

  4. Ola Ricardo,
    o metodo localizar_endereco pega o valor do input endereco_cep:

    $.getJSON(“/enderecos/localizar_endereco”, { cep: $(“#endereco_cep”).val()},function

    @endereco = BuscaEndereco.por_cep params[:cep]

  5. Ronaldo C. Schork Jr. says:

    Muito bacana o post Iuri.

    Aqui para mim, na linha 9 do JS:
    if ($.trim(endereco_cep.value) != “”) {

    Deu erro… fiz assim:
    if ( $.trim($(“#endereco_cep”).val()) != “”) {

    Funcionou blz…

    Gostei bastante da dica… até pq não sabia como fazer essa busca por cep por ajax, e o jQuery é show.

    Outra coisa que fiz, foi colocar o código javascript dentro do arquivo “application.js” e incluí esse arquivo no application.erb.html

    Valeu pela dica.

    Abração

  6. Elverone says:

    Seria possivel essa busca de cep ser feita usando “Protocol Buffer” da google? Acho que ficaria bem mais rapido, apesar de json ser muito bom.

  7. Oi Elverone, nunca usei o Protocol Buffer, mas posso te dizer que o json é bem rapido, pois se trata apenas de uma serialização de um objeto, não creio que você teria ganho, mesmo o outro sendo mais rápido.

  8. Muito bom cara….
    Funciona que é uma beleza…

  1. There are no trackbacks for this post yet.

Leave a Reply