Construindo relações entre modelos de Rails
Contribuição de Brian Leonard, manutenção de Gail Chappell
Dezembro de 2007 [Número da versão: V6.0-3]
Este tutorial descreve como construir relações (um para um e um para vários) entre modelos em um projeto NetBeans Ruby on Rails.
Conteúdo
Para concluir este tutorial, você precisa do seguinte software.
* Este tutorial, escrito para o Rails 1.2.5, envolve scaffolding. Como o scaffolding não tem suporte no Rails 2.0, você não pode concluir este tutorial usando Rails 2.0.
Criando o banco de dados de amostra
Este tutorial é baseado no tutorial Criando um weblog Ruby em 10 minutos.
Se você tiver concluído este tutorial, poderá começar com o projeto que construiu quanto terminou o tutorial e ir para a próxima seção. Do contrário, baixe o arquivo RubyWebLog.zip e siga estas etapas para criar o banco de dados de amostra.
Observação: este tutorial usa o servidor de banco de dados MySQL. Consulte o artigo Instalando e configurando suporte a Ruby para obter informações sobre o uso de um servidor de banco de dados MySQL em um aplicativo Ruby.
O artigo também descreve como usar o servidor de banco de dados Java DB.
- Abra uma janela de comando.
- Caso ainda não tenha sido iniciado, inicie o servidor de banco de dados MySQL.
- Digite o seguinte comando para criar o banco de dados de desenvolvimento e pressione Enter.
mysqladmin -u root -p create rubyweblog_development
Observação: se o usuário raiz não tiver uma senha obrigatória, omita o argumento -p.
Abra o projeto rubyweblog no IDE.
Observação: na primeira vez que um projeto Ruby é aberto ou criado no IDE, o IDE verifica se há outras instalações do Ruby além do software JRuby fornecido. Caso haja, o IDE exibe uma caixa de diálogo solicitando que você selecione qual software deseja usar. Escolha JRuby se você desejar usar o intérprete JRuby fornecido ou escolha a sua instalação do Ruby, caso prefira utilizá-la. Para obter mais informações, consulte Configurando o IDE para usar sua própria instalação do Ruby no tutorial Instalando e configurando Ruby.
Se o banco de dados solicitar senha, edite o arquivo database.yml e forneça a senha na configuração do desenvolvimento. Salve o arquivo.
Para acessar rapidamente o arquivo database.yml, pressione Alt+Shift+O (Ctrl+Shift+O no Mac), digite database.yml no campo de texto Nome do Arquivo e pressione Enter.
-
Clique com o botão direito do mouse no nó do rubyweblog e escolha Migrar banco de dados > Para versão atual.
Esta ação atualiza o banco de dados para incluir a tabela de postagem e adiciona um campo de corpo.
A janela Saída indica quando a migração está completa.
-
Execute a aplicação e crie uma nova postagem.
Criando o modelo Comentário
Este tutorial aprimora o projeto rubyweblog permitindo que os leitores adicionem comentários em uma postagem de blog.
Comece criando o modelo Comentário para armazenar instâncias dos comentários dos leitores. O projeto já inclui um modelo Postagem para armazenar instâncias de postagens de blogs.
-
Na janela Projetos, expando o nó do rubyweblog se ainda não estiver expandido, clique com o botão direito do mouse no nó Modelos e escolha Gerar.
Digite Comment post_id:integer created_at:datetime comment:text
no campo Argumentos e clique em OK.
O Gerador de Rails cria um modelo chamado Comentário. Este modelo inclui os seguintes arquivos:
- app/models/comment.rb. Um arquivo que possui os métodos do modelo Comentário. Este arquivo é aberto na área de edição.
- test/unit/comment_test.rb. Um teste de unidade para verificar o modelo.
- test/fixtures/comments.yml. Uma ferramenta de teste para preencher o modelo.
-
db/migrate/migrate/003_create_comments.rb.
Um arquivo de migração para alterar a estrutura do banco de dados. Este arquivo é versão 003 porque o projeto já possui dois arquivos de migração,
001_create_posts.rb e 002_add_body.rb, que criam e modificam a tabela de postagem.
Migrando o banco de dados
O arquivo com o qual você trabalhará em seguida será o arquivo de migração, 003_create_comments.rb.
Na janela Saída, clique no link do arquivo 003_create_comments.rb.
O arquivo é aberto para mostrar o método self.up, que cria uma tabela chamada comentários e o método self.down, que desfaz a tabela comentários, conforme mostrado no seguinte código de exemplo:
class CreateComments < ActiveRecord::Migration
def self.up
create_table :comments do |t|
t.column :post_id, :integer
t.column :created_at, :datetime
t.column :comment, :text
end
end
def self.down
drop_table :comments
end
end
Esta migração cria uma tabela de comentários com quatro campos: id, que contém um inteiro, post_id, que contém um inteiro; created_at, que armazena a data e a hora; e comment, que contém uma descrição de texto.
Clique com o botão direito do mouse no nó do rubyweblog e escolha Migrar banco de dados > Para versão atual.
Esta ação atualiza o banco de dados para incluir a tabela de comentários. A janela Saída indica quando a migração está completa.
Definindo uma relação entre os modelos Postagem e Comentário
Você agora possui dois modelos na aplicação: o modelo Postagem, que cria uma nova postagem de blog e o modelo Comentário, que adiciona um comentário a uma postagem de blog. Aqui você define uma relação entre os dois modelos para que um comentário seja associado a uma única postagem e uma postagem possa conter vários comentários.
- Expanda o nó Modelos e abra
post.rb.
-
Adicione a seguinte associação has_many a post.rb:
class Post < ActiveRecord::Base
validates_presence_of :title, :body
has_many :comments
end
O método has_many indica que a postagem pode ter zero, um ou mais registros de comentários associados a ela.
Digitar o acionador hm e pressionar Tab expande para o modelo de código has_many :objects.
-
Abra Modelos > comment.rb e adicione a associação belongs_to:
class Comment < ActiveRecord::Base
belongs_to :post
end
O método belongs_to indica que um comentário pode ser associado somente a uma postagem. Por padrão, o ActiveRecord usa post_id para associar um comentário à postagem que possui o post.id correspondente.
O acionador bt expande para belongs_to :object.
Modificando o scaffolding do controlador
Em seguida, você trabalhará com o controlador, blog_controller.rb, que gera o scaffolding, ou a interface básica para criar, ler, atualizar e excluir entradas na postagem de blog.
-
Expanda o nó Controladores e abra blog_controller.rb.
O controlador possui todas as ações de scaffold, incluindo index, list, show, new, create, edit, update e destroy.
-
Modifique a ação show conforme mostrado no seguinte código de exemplo para salvar o post_id em flash:
def show
@post = Post.find(params[:id])
flash[:post_id] = @post.id
end
O código localiza a postagem associada ao parâmetro id passado com a solicitação. Em seguida, armazena o id no flash para uso posterior. O flash é similar a uma sessão HTTP, mas em uma única requisição. Quando você coloca algo no flash, ele fica disponível para a próxima requisição, e depois some (por isso o nome flash).
-
Vá até o final do arquivo blog_controller.rb e adicione a seguinte ação post_comment antes da instrução end final:
def post_comment
@comment = Comment.new(
"post_id" => flash[:post_id],
"created_at" => Time.now,
"comment" => params[:comment]['comment']
)
if @comment.save
flash[:notice] = 'Comentário adicionado com sucesso'.
redirect_to :action => 'show', :id => flash[:post_id]
end
end
A ação post_comment é chamada quando o usuário clica no botão Postar para submeter um comentário. O primeiro bloco de código obtém o post_id do flash (que é algo como 1, 2 ou similar) e o utiliza para localizar a postagem de blog associada a esse id. O código então cria um novo objeto Comentário para ser associado a esse post_id, também consistindo da data de criação e do comentário em si. A estrutura de Rails passa os parâmetros enviados da página como hash (params[:comment]), do qual o código obtém o parâmetro de comentário (params[:comment]['comentário']).
O comentário é uma classe ActiveRecord, assim, quando seu método save é chamado, o registro do comentário é salvo no banco de dados.
A mensagem é então colocada no flash. O código chama a ação show, que carrega a página show.rhtml. Esta página recarrega a postagem e todos os seus comentários, incluindo o novo.
Modificando a visualização para adicionar comentários
Aqui você edita o arquivo show.rhtml, que exibe uma entrada de blog individual.
-
Expanda Visualizações > blog e abra
show.rhtml.
-
Adicione o seguinte código no final de show.rhtml:
<hr>
<h4>Comments</h4>
<% form_tag :action => 'post_comment' do %>
<p><label for="comment_comment">Comment</label><br/>
<%= text_area 'comment', 'comment' %></p>
<%= submit_tag "Post" %>
<%end %>
Este código produz um formulário que inclui uma área de entrada de texto para escrever o comentário e um botão Enviar rotulado como Postar, conforme mostrado na figura. A ação post_comment é chamada quando o formulário é submetido.
-
Salve os arquivos e execute a aplicação.
-
Clique em um Permalink para exibir os detalhes de uma entrada de blog.
Tente adicionar um comentário na área de texto, mas observe que o blog ainda não exibe comentários quando você clica no botão Postar.
Se a postagem tiver sucesso, você verá uma mensagem na parte superior da visualização, conforme mostrado na figura a seguir. Nas próximas etapas, você adicionará código para coletar e exibir os comentários.
Exibindo os comentários
O blog ainda não exibe os comentários adicionados pelo leitor. Esse problema será solucionado aqui.
-
Em blog_controller.rb, localize a ação show e insira a seguinte variável da instância post_comments para coletar os comentários:
def show
@post = Post.find(params[:id])
@post_comments = @post.comments.collect
flash[:post_id] = @post.id
end
Como você adicionou a relação has_many :comments ao modelo Postagem, pode acessar todos os comentários de uma postagem chamando @post.comments.
-
Modifique show.rhtml copiando e colando o conteúdo da seguinte marcação <ul> logo após a linha <h4>Comments</h4>:
<ul>
<% @post_comments.each do |comment| %>
<li><%= h comment.comment %><br>
<div style="color: #999; font-size: 8pt">
Posted on <%= comment.created_at.strftime("%B %d, %Y at %I:%M %p") %>
</div>
</li>
<% end %>
</ul>
Este código atribui estilo aos comentários, exibe-os em uma lista com marcadores e inclui a data e a hora em que o comentário foi postado.
-
Escolha Arquivo > Salvar todos e atualize o navegador.
Os comentários agora aparecem no blog em uma lista com marcadores, conforme mostrado na figura a seguir.
Próximas etapas
>> Mais documentação do NetBeans Ruby