domingo, 22 de novembro de 2009

Tela de Cadastro com Many-to-Many - correção

Pessoal,

O Maurício Linhares (http://codeshooter.wordpress.com) deu uma dica para melhorar o código do post anterior, na partial _form.rhtml onde temos o nome do campo checkbox, devemos trocar disciplina_ids[] por aluno[disciplina_ids][] e no controller alunos_controller.rb não é necessário colocar o código @aluno.disciplinas = Disciplina.find(params[:disciplina_ids]) if params[:disciplina_ids] nos métodos create e update.

Valeu Maurício pela dica!

sexta-feira, 20 de novembro de 2009

Tela de Cadastro com Many-to-Many

* Esse post foi baseado no tutorial de Jeffrey Hicks e no Railscast número 47.

A idéia deste post é mostrar na prática como fazer um tela de cadastro havendo uma relação many-to-many. Para criar esse tutorial estou usando o Netbeans 6.7.1 e o banco de dados MySQL.

Primeiro passo é criar um projeto Rails chamado escola.

Esse exemplo mostra uma parte do que seria um sistema acadêmico, onde eu tenho uma tabela de alunos, disciplinas e uma relação alunos por disciplina. Para trabalhar com o padrão do Rails seguiremos a convenção de nome para as tabelas e os campos.



  • Repare que o nomes das tabelas estão no plural.
  • Os campos chaves são chamados de id.
  • A tabela de relacionamento é na ordem alfabética.
  • O campo de relacionamento é o nome da entidade no singular seguido de _id.
O segundo passo é gerar os scaffolds para aluno e disciplina, abaixo mostro a tela de gerar o scaffold do Netbeans 6.7.1 para o model aluno, a mesma operação deve ser feita para disciplina (lembre-se que o nome do model deve ser no singular).


Altere os models aluno.rb e disciplina adicionando o método has_and_belongs_to_many conforme imagem abaixo.

Essa alteração diz que disciplina tem e pertence a muitos alunos e aluno tem e pertence a muitas disciplinas. O método has_and_belongs_to_many é que faz o relacionamento n:n.

Como precisaremos de uma tabela de relacionamento, vamos criar uma migração de nome create_alunos_disciplinas para essa tabela.


Edite o código dessa nova migration conforme imagem abaixo:


Essa tabela não terá a chave primário id. Rode as migrations.

Para permitir que o usuário informe um aluno com várias disciplinas, vamos utilizar checkbox múltiplos. O nosso formulário será gerado dinamicamente a partir das disciplinas cadastradas no banco de dados. Nossa view vai depender do controller alunos_controller para carregar as disciplinas, altere o método new e edit do controller alunos_controller.rb conforme imagem abaixo.



Agora iremos customizar as views edit e new de alunos. Vamos fazer isso em um único local, ou seja, na partial _form.rhtml - para isso crie dentro de views/alunos o arquivo _form.rhtml e coloque o código abaixo.


Nessa partial colocamos um for para carregar os checkbox com os valores e nomes das disciplinas disponibilizadas pelo objeto @disciplinas que foi passado nos métodos new e edit do controller. Repare que o botão f.submit tá com nome button, esse nome é passado como parâmetro na chamada da partial nas views new e edit e o :disable_with serve para desabilitar o botão com a mensagem "Aguarde..." enquanto a requisição estiver ocorrendo. Abaixo o código das views alteradas, veja que na chamada da partial, passamos o parâmetro :button com o texto que vai aparecer nos botões.


Vamos alterar agora a view index de alunos para poder mostrar as disciplinas que o mesmo está associado.



Os métodos update e create de alunos_controller.rb recebem requisições das views edit e new. Para armazenar o relacionamento precisamos converter disciplinas_ids para objetos Disciplina com Disciplina.find(@params[:disciplina_ids]) if @params[:disciplina_ids]. O if previne erros de objetos nulos quando o aluno não estiver associado a alguma disciplina.



Agora é só testar!!!! Veja algumas telas abaixo.


quinta-feira, 12 de novembro de 2009

Formulário Simples de Pesquisa

A idéia desse post é permitir filtrar o grid de Locadoras que está na página index.

Sabemos que a página inicial é a página index.html.erb do controller Locadoras, abra o arquivo e adicione o trecho de código destacado.


O helper form_tag inicia uma tag form que aponta a ação para uma url configurada com locadoras_path e método get. De acordo com métodos padrões REST, locadoras_path será substituida por /locadoras, ou seja, com o verbo get e o path /locadoras, a ação a ser executada será a index - trocando em miúdos, carregará a própria página.

O helper text_field_tag cria um campo texto padrão, onde o primeiro parâmetro é o nome do campo e o segundo é o value - trocando em miúdos, um campo com nome :search e o valor será o próprio valor digitado quando o formulário for submetido.

O helper submit_tag cria um botão submit padrão, onde o primeiro parâmetro é o texto que aparecerá no botão, o segundo parâmetro é um hash, que nesse caso, estamos dizendo que o botão não tem campo nome, para que não seja passado pela url.

Como estamos chamando o método index, vamos alterá-lo no controller de locadoras.


Reparem que agora o método índex retorna @locadoras, que ao invés de ter ser resultado do método all (Locadoras.all), é resultado do método search, e de onde vem esse método search? Vem do model locadora, conforme abaixo:



Criamos o método search que recebe um parâmetro, verificamos se p existe, em caso afirmativo, chamamos o método find, onde o mesmo retornará todos os registros que atendam à condição passada, caso contrário, retorna todos os registros.

Este post foi baseado pelo vídeo abaixo:

http://media.railscasts.com/videos/037_simple_search_form.mov


quinta-feira, 22 de outubro de 2009

LinguÁgil 2009


A proliferação de tecnologias para o desenvolvimento de aplicações web vem gerando exaustivas discussões sobre qual adota-las em seus projetos. Java, PHP e Ruby estão entre as 10 linguagens de programação mais utilizadas no mundo, segundo a TIOBE Programming Community. Em paralelo, os mesmos profissionais buscam melhorar seus serviços adotando metodologias que ao mesmo tempo permitam o controle de seus projetos, gerem valor agregado aos clientes e evitem excesso de burocracia.

Diante desse cenário, os grupos AgileBahia, JavaBahia, PHPBahia e RailsBahia realizarão em Salvador a edição 2009 doLinguÁgil - Misturando Linguagens e Agilidade. Inédito na Bahia, o evento reune algumas das principais comunidades de TI, buscando estimular aprendizado e discussões em torno de linguagens de programação e metodologias ágeis.

quarta-feira, 21 de outubro de 2009

Formulário com Combo

Dando continuidade nas aulas, vou mudar um pouco, ao invés de PowerPoint colocarei um post tradicional. A idéia desse post é mostrar como ajustar uma tela gerada pelo scaffold adicionando uma combobox.

Obs: O exemplo aqui serve somente para ensinar o uso de combobox, não se trata da regra de negócio que pretendo aplicar, pois na tela de cadastro de memo vocês verão a combo de usuário, mas na realidade, o usuário vai ser pego da sessão.

Primeiro passo então é gerar o scaffold para memo (visto em aulas passadas).

Sabemos que um usuário pode ter zero ou mais memos e um memo só pode ter um usuário, então temos uma relação zero para muitos. Para refletir essa relação, altere os models User e Memo conforme imagem abaixo.



Como memo se relaciona com usuário, sua tela de cadastro (view new) deve ter uma combo com os usuários disponíveis para seleção.


Agora abra o código fonte da view new do controller memo, no meu caso (c:\agenda\app\views\memos\new.html.erb). Veja que onde tem trocamos por .


O método helper f.select é o responsável em criar uma caixa de seleção e recebe os parâmetros:
:user_id – é o nome do campo na tabela memo
@users – hash que é retornado pelo controller *veremos abaixo
:prompt=>”texto” – texto que aparece na combo

Agora abra o memos_controller.rb e adicione um filtro que chama o método loadUsers antes dos métodos new, edit, create e update. Altere também o método index colocando o include no Memo.all, isso fará que o método carregue somente uma vez os usuários.



Adicione antes do último end o código do método loadUsers que retorna o objeto @users (lembra-se que usamos ele na view new para preencher a combo) que é uma hash de usuários. Cada objeto só tem os atributos login e id.

O método collect retorna um hash de todos os objetos retornados no método all.

Ao submeter a página, sabemos que o sistema redirecionará para a view show (c:\agenda\app\views\memos\show.html.erb) , e nela devemos mostrar o nome do usuário, então basta ajustar o código conforme imagem abaixo. Repare que só alteramos a linha 7, onde tinha @memo.user colocamos @memo.user.login.

Analogamente, você pode alterar a view index para que mostre também o nome do usuário na listagem que aparece.

quarta-feira, 30 de setembro de 2009

Autenticação no Rails



Para baixar os fontes clique aqui.

domingo, 13 de setembro de 2009

Livro: Use a Cabeça! Rails

A AltaBooks disponibiliza o primeiro capítulo do livro Use a Cabeça! Rails, acesso link http://altabooks.tempsite.ws/capitulos_amostra/UC%20rails.pdf e divirta-se!

sexta-feira, 11 de setembro de 2009

domingo, 6 de setembro de 2009

Introdução ao Ruby



Slides da aula de Introdução ao Ruby da disciplina Desenvolvimento Web com Banco de Dados da Faculdade Hélio Rocha.

sexta-feira, 24 de julho de 2009

Cursó Ágil na Prática


A Index TI, empresa especializada em metodologias ágeis, oferece o curso “Ágil na Prática”, composto por aulas presenciais teóricas e práticas, demonstrando a aplicabilidade das metodologias de gerenciamento e desenvolvimento ágil Scrum e XP (Extreme Programming) utilizando o framework Ruby on Rails.

Maiores informações clique aqui.

sexta-feira, 20 de março de 2009

Maré de Agilidade

Entre os dias 26.03 e 31.03 ocorrerá em Salvador a 2ª Edição do Evento Maré de Agilidade.

http://www.maredeagilidade.com.br/

terça-feira, 10 de março de 2009

segunda-feira, 23 de fevereiro de 2009

domingo, 15 de fevereiro de 2009

Curso de Ruby on Rails - parte 2

Curso de Ruby on Rails - parte 1

Boas vindas!

Caros leitores,

Eu tenho um costume de fazer slides de tudo que eu esteja estudando. Como decidi estudar o Ruby On Rails esse ano, venho através desse blog disponibilizar esses slides.

Caso eu tenha feito alguma referência a algum material e não tenha colocado, favor me enviem um e-mail para que possa fazer as devidas correções.

Todo os slides que colocarei aqui podem ser distribuídos e modificados conforme necessidade de cada um, só peço que assim como eu cito as referências citem meu nome ou pelo menos o meu blog.

Sejam bem vindos e qualquer ajuda, dica, indicação serão bem vindos.