FeaturesPluginsDocs & SupportCommunityPartners

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

 O conteúdo desta página se aplica ao IDE NetBeans 6.0

Para concluir este tutorial, você precisa do seguinte software.

Software ou recurso Versão necessária
NetBeans IDE com suporte a Ruby and Rails Versão 6.0
Servidor de banco de dados MySQL Versão 5.0
Rails Framework 1.2.5*

* 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.

  1. Abra uma janela de comando.
  2. Caso ainda não tenha sido iniciado, inicie o servidor de banco de dados MySQL.
  3. 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.

  4. 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.

  5. 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.
  6. 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.
  7. 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.

  1. 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.

  2. 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.

  1. 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.
  2. 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.

  1. Expanda o nó Modelos e abra post.rb.
  2. 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.

  3. 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.

  1. 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.
  2. 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).
  3. 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.

  1. Expanda Visualizações > blog e abra show.rhtml.
  2. 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.
  3. Salve os arquivos e execute a aplicação.
  4. 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.

    Visualização do modelo Comentário, mas sem comentários

Exibindo os comentários

O blog ainda não exibe os comentários adicionados pelo leitor. Esse problema será solucionado aqui.

  1. 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.
  2. 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.
  3. 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.

    Figura 2: visualização do modelo Comentário, com comentários

Próximas etapas

>> Mais documentação do NetBeans Ruby


Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by