Começando a postar no blog hoje
vou mostrar como fazer um filtro simples de produtos por Categoria, utilizando
Rails 3.0.4 e Ruby 1.9.6 :D
O Primeiro passo é a criação de
um projeto utilizando o banco de dados MySQL.
rails new Aplicacao –d mysql
Com a aplicação criada, vamos acessar a pasta do projeto e criar o
banco de dados com o comando
rake db:create
após o banco criado, vamos gerar
os scaffolds da aplicação , serão dois
rails g scaffold Category name:string
rails g scaffold Product
name:string category:references
rake db:migrate
Simples, só pra mostrar como funcionara a busca.
Agora faremos uma alteração no controller e view de produtos
para ela trazer um combobox com as categoria para o produto.
Primeiro
fazemos a alteração no controller de product para que ele traga todos as
categorias , faremos isso usando um before_filter, que irá buscar todas as
categorias, antes de chamar qualquer action do controller , da maneira como
está na imagem abaixo :
Agora faremos uma alteração na view para que ela traga um
combox na hora de cadastra um novo Product
Agora ao entrar no Edit/new do Product ele trará um combobox
com as opções de categoria.
Agora teremos outra alteração dessa vez em
views/layouts/application.html.erb , para que ele tenha um menu de acesso aos
scaffolds
Inicie o servidor e teste a aplicação fazendo alguns
cadastros para ambos scaffolds
rails server
Agora vamos a parte onde faremos o filtro de categorias, vamos
até a view de index de produtos e faremos ela listar todas as categorias.
Feito isso agora precisamos mudar a busca na action index do
controller de product que é pra onde vai ser enviado o parâmetro :category_id.
Faremos uma alteração deixando assim a principio:
Testando
no navegador, já podemos ver o resultado, o filtro acontece de acordo com a
categoria passada
O
codigo está pronto, mas pode ser melhorado, tendo em vista que o Rails adota a
convenção ‘modelos gordos, controllers magros’ podemos passar a logica de
filtro para um metodo no modelo de Product, e apenas chama-lo, ficando dessa
maneira no modelo de Product
Agora é só chamar esse método no controller assim :
Abraço :)
Luiz Cezer.