Tutorial: Criando uma aplicação em Rails 3 e Mysql (Parte 1)

Olá pessoal, hoje nós vamos dar início a um tutorial básico de Rails, com a ideia de criar um sistema básico de controle de gastos.

A minha intenção com este post é fugir daquele tradicional tutorial para construir um blog ou alguma coisa parecida, e também utilizar os recursos da versão 3 do Rails. Vou tentar abordar aqui técnicas importantes no desenvolvimento de qualquer aplicação em Rails, como: Relacionamento, validação, edição de layout, utilização de plugins entre outros.

Por se tratar de um conteúdo um pouco extenso vou colocá-lo aqui no blog por partes.

O problema a ser abordado será o seguinte:

  • O usuário deve poder lançar seu gastos informando a data, descrição, valor e categoria dos gasto (centro de custo).
  • O usuário poderá incluir quantas categorias quiser.
  • O usuário poderá excluir um lançamento errado.
  • O usuário terá acesso a alguns relatórios (Relatório detalhado, Total gasto por mês, Total gasto por centro de custo)

Agora que temos os requisitos do usuário vamos dar início a modelagem no nosso banco de dados.

Este é um modelo bem simples mas o importante aqui é visualizarmos o relacionamento entre as entidades CentroDeCustos e Lancamentos, assim definimos que:
Um CentroDeCustos tem muitos Lançamentos e um Lançamento pertence a um CentroDeCusto, ou seja, um relacionamento de 1:N (1 para muitos).

Agora que definimos o nosso modelo de relacionamento vamos começar com o desenvolvimento do sistema.

Abra o seu prompt de comando para criar a sua aplicação Rails. (Caso você ainda não tenha configurado um ambiente de produção para Rails siga meu tutorial de instalação de um ambiente de desenvolvimento no Ubuntu)

Vamos criar a aplicação com o comando:

rails new controle_gastos -d mysql

O controle_gastos é o nome da nossa aplicação.

A diretiva -d mysql define qual banco de dados será utilizado. Caso você queira utilizar outro por exemplo -d postgresql.

Ao executar esse comando, o Rails criará para você um diretório /controle_gastos contendo os arquivos da nossa aplicação, acesse esse diretório para começarmos o desenvolvimento.

O primeiro passo é configurar a conexão com o banco de dados editando o arquivo

/config/database.yml

Se o seu ambiente estiver configurado corretamente a única coisa a fazer é inserir o nome do usuário e senha de acesso do banco de dados.

Edite os itens username e password de todos os ambientes (development, test, production), no meu caso o username é root e o password é 123, desta forma, o arquivo ficou assim:

# MySQL.  Versions 4.1 and 5.0 are recommended.
#
# Install the MySQL driver:
#   gem install mysql2
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
 adapter: mysql2
 encoding: utf8
 reconnect: false
 database: controle_gastos_development
 pool: 5
 username: root
 password: '123'
 socket: /var/run/mysqld/mysqld.sock

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
 adapter: mysql2
 encoding: utf8
 reconnect: false
 database: controle_gastos_test
 pool: 5
 username: root
 password: '123'
 socket: /var/run/mysqld/mysqld.sock

production:
 adapter: mysql2
 encoding: utf8
 reconnect: false
 database: controle_gastos_production
 pool: 5
 username: root
 password: '123'
 socket: /var/run/mysqld/mysqld.sock

Depois de configurada a conexão vamos criar os bancos de dados de desenvolvimento e teste executando o seguinte comando.

rake db:create

Vamos criar os arquivos relacionados a entidade centro de custos.

rails g scaffold CentroDeCusto nome:string

O scaffold um é comando do Rails que monta um esqueleto da aplicação com o famoso CRUD, que nada mais é do que inserir, visualizar, alterar e deletar elementos de um model com o intuito de acelerar o desenvolvimento evitando o retrabalho.

O scaffold é baseado em um model, o model é uma abstração que a do rails faz da informação (dados) e a manipulação dessa informação dentro da nossa aplicação. Para o nosso exemplo podemos entender que o model representa uma entidade (tabela) do banco de dados e as suas regras de interações.

O nome do model deve sempre estar no singular, no nosso caso, CentroDeCusto. Quanto se trata se uma palavra composta por mais de um termo deve se usar uma letra maiúscula no início de cada termo.

Um dos arquivos criados pelo scaffold é o de migração. Os arquivos de migração compõe a estrutura das tabelas do banco.

Os arquivos de migração ficam no diretório

/db/migrate

Os nomes dos arquivos de migração são compostos pela data e hora de criação do arquivo e o nome da ação que que ele vai realizar. Por exemplo:

20110222153321_create_centro_de_custos.rb

Abra o seu arquivo migração e edite-o da seguinte forma:

class CreateCentroDeCustos  45, :null => false

 t.timestamps
 end
 end

 def self.down
 drop_table :cento_de_custos
 end
end

Inserimos na linha 4 o parâmetro :null=> false que equivale ao not null quando nós estamos criando uma tabela no mysql, ou seja, o campo nome não aceita valores em nulos. O parâmetro :limit => 45 determina que este campo receberá no máximo 45 caracteres.

Para que a migração seja executada use:

rake db:migrate

Para a entidade lancamentos você executará no prompt o seguinte comando:

rails g scaffold Lancamento descricao:string valor:decimal date:date centro_de_custo:references

Editando o arquivo de migração ele ficará assim:

class CreateLancamentos < ActiveRecord::Migration
 def self.up
 create_table :lancamentos do |t|
 t.string :descricao, :null => false
 t.decimal :valor, :precision => 2, :null => false
 t.date :date, :null => false
 t.references :centro_de_custo

 t.timestamps
 end
 end

 def self.down
 drop_table :lancamentos
 end
end

Na linha 5 para o campo valor nós usamos o tipo decimal com o parâmetro :precision => 2 que se refere a quantas casas decimais o campo vai conter, como estamos trabalhando com moeda vamos usar 2 casas.

Notamos também que o campo t.references :centro_de_custo faz referência ao model centro de custo, isso significa que cada registro do lançamento fará referência a um centro de custo, assim como foi explicado com o diagrama de entidade relacional do início deste tutorial.

Vamos rodar a migração com o comando:

rake db:migrate

Vamos dar uma olhadinha nos nossos models que estão no diretório:

/app/model/

Primeiro o lancamento.rb

class Lancamento > ActiveRecord::Base
belongs_to :centro_de_custo
end

Percebemos que existe uma linha dentro da classe, essa linha representa justamente o relacionamento que o model Lancamento tem com CentroDeCusto, um lançamento pertence a um centro de custo belongs_to :centro_de_custo. Esse comando foi inserido no model quando definimos no scaffold centro_de_custo:references.

Agora precisamos inserir no model centro_de_custo.rb a linha que garante o relacionamento com o model lançamento, o mesmo ficará desta forma:

class CentroDeCusto > ActiveRecord::Base
has_many :lancamentos
end

O detalhe quando estamos falando de um para muitos has_many o parâmetro do model de referencia deve estar no plural, em português ficaria assim, o Centro de Custos tem muitos lançamentos, no Rails has_many :lancamentos.

Ao que se refere a relacionamento ainda temos:

has_one – tem um

has_and_belongs_to_many – tem a pertence a muitos.

Para que a gente possa testar a nossa aplicação vamos fazer mais uma mudança, dessa vez no seguinte arquivo

/app/view/lancamentos/_form.html.rb

Este é o arquivo do formulário de inclusão e edição de lançamentos.

Vamos localizar a as linhas:

<%= f.label :centro_de_custo %><br />
<%= f.text_field :centro_de_custo %>

E alterá-las para:

<%= f.label :centro_de_custo_id %><br />
<%= f.text_field :centro_de_custo_id %>

Vamos dar uma olhada na nossa aplicação. para que o rails rode em um servidor local é necessário rodar o seguinte comando:

rails s

Acesse o endereço http://localhost:3000/centro_de_custos/ e castre um novo centro de custo conforme a imagem abaixo.

Com isso acabamos de fazer um inserção na tabela do banco, e ,por padrão, o Rails atribui automáticamente 3 valores adicionais ao elemento que foi criado.

id – O identifcador único e sequencial do elemento.

created_at – Data e hora de criação.

updated_at – Data e hora da última edição.

Em seguida cadastre um lançamento em http://localhost:3000/lacamentos

Quando colocamos o valor 1 no campo centro de custos, na verdade o que estamos fazendo, é colocar o id do centro de custo ao qual o lancamento irá pertencer.

Bem, por hoje foi isso, aguardem o próximos posts, e sugestões podem ser enviadas aqui pelos comentários.

Veja a continuação deste tuturial.

2 Respostas

  1. Sou iniciante no mundo rails e gostaria muito de aprender como fazer uma campo “Select” só que “buscando” dados de outra tabela exemplo:

    Tenho um cadastro de documentos e cada documento tem um tipo ex : Mineração, Plantio … (esses tipo de documentos existem, mas em outra tabela).

    Como eu poderia fazer para chama-los no meu campo “select” ?

    Se puder me Ajudar.
    Obrigado.

  2. […] Vamos dar continuidade ao nosso tutorial sobre Rails 3, se você não leu a primeira parte clique aqui. […]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: