https://sites.google.com/site/infoxiii/ * Esse post foi baseado no tutorial de Jeffrey Hicks e no Railscast numero 47.A ideia deste post e mostrar na pratica como fazer um tela de cadastro havendo uma relacao many-to-many. Para criar esse tutorial estou usando o Netbeans 6.7.1 e o banco de dados MySQL.Primeiro passo e criar um projeto Rails chamado escola.Esse exemplo mostra uma parte do que seria um sistema academico, onde eu tenho uma tabela de alunos, disciplinas e uma relacao alunos por disciplina. Para trabalhar com o padrao do Rails seguiremos a convencao de nome para as tabelas e os campos.Repare que o nomes das tabelas estao no plural.Os campos chaves sao chamados de id.A tabela de relacionamento e na ordem alfabetica.O campo de relacionamento e o nome da entidade no singular seguido de _id.O segundo passo e 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 operacao 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 metodo has_and_belongs_to_many conforme imagem abaixo.Essa alteracao diz que disciplina tem e pertence a muitos alunos e aluno tem e pertence a muitas disciplinas. O metodo has_and_belongs_to_many e que faz o relacionamento n:n.Como precisaremos de uma tabela de relacionamento, vamos criar uma migracao de nome create_alunos_disciplinas para essa tabela.Edite o codigo dessa nova migration conforme imagem abaixo:Essa tabela nao tera a chave primario id. Rode as migrations.Para permitir que o usuario informe um aluno com varias disciplinas, vamos utilizar checkbox multiplos. O nosso formulario sera 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 metodo 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 unico local, ou seja, na partial _form.rhtml - para isso crie dentro de views/alunos o arquivo _form.rhtml e coloque o codigo 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 metodos new e edit do controller. Repare que o botao f.submit ta com nome button, esse nome e passado como parametro na chamada da partial nas views new e edit e o :disable_with serve para desabilitar o botao com a mensagem "Aguarde..." enquanto a requisicao estiver ocorrendo. Abaixo o codigo das views alteradas, veja que na chamada da partial, passamos o parametro :button com o texto que vai aparecer nos botoes.Vamos alterar agora a view index de alunos para poder mostrar as disciplinas que o mesmo esta associado.Os metodos update e create de alunos_controller.rb recebem requisicoes 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 nao estiver associado a alguma disciplina.Agora e so testar!!!! Veja algumas telas abaixo. A proliferacao de tecnologias para o desenvolvimento de aplicacoes web vem gerando exaustivas discussoes sobre