Como usar o PostgreSQL com Ruby

Nesta parte do tutorial do aplicativo Bookshelf, veja como o aplicativo de amostra armazena os dados permanentes dele em um banco de dados PostgreSQL.

Neste exemplo, usamos um servidor PostgreSQL, em execução em uma instância de máquina virtual do Compute Engine, para armazenar os dados persistentes. Se você preferir usar um servidor PostgreSQL diferente, será possível implantar esse aplicativo de amostra no Google Cloud Platform (GCP) e configurá-lo para usar qualquer servidor PostgreSQL de sua escolha.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, consulte Aplicativo Bookshelf em Ruby.

Como executar o PostgreSQL no Compute Engine

  1. Use a imagem do PostgreSQL fornecida pelo Bitnami no Google Cloud Platform Marketplace.
  2. Clique em Iniciar no Compute Engine. Leva alguns minutos para criar a instância e implantar o PostgreSQL.

  3. Quando a implantação estiver concluída, anote o usuário e a senha do administrador do seu banco de dados do PostgreSQL.

  4. Clique no link da instância para acessar os detalhes da instância de VM. Anote o endereço IP externo da instância.

    Captura de tela da instância de VM

  5. Para editar a instância, clique em Editar create. No campo Tags de rede, digite postgres-bitnami e clique em Salvar.

  6. Crie uma regra de firewall para permitir o tráfego para o PostgreSQL em instâncias com a tag de rede postgres-bitnami:

    gcloud compute firewall-rules create default-allow-postgresql \
        --allow tcp:5432 \
        --source-ranges 0.0.0.0/0 \
        --target-tags postgres-bitnami \
        --description "Allow access to PostgreSQL from all IPs"
    

Como definir configurações

  1. Acesse o diretório getting-started-ruby/2-postgresql e copie o arquivo de amostra database.yml:

    cp config/database.example.yml config/database.yml
    
  2. Para configurar o banco de dados, edite o arquivo config/database.yml. Defina o valor de database para bookshelf. Substitua os marcadores [YOUR_POSTGRES_*] pelos valores específicos do banco de dados e da instância do PostgreSQL.

    Por exemplo, suponha que seu endereço IPv4 seja 173.194.230.44, seu nome de usuário seja postgres e sua senha seja secret123. A seção postgresql_settings do arquivo database.yml teria a seguinte aparência:

    postgresql_settings: &postgresql_settings
      adapter: postgresql
      encoding: unicode
      pool: 5
      username: postgres
      password: secret123
      host: 173.194.230.44
      database: bookshelf
    

Como instalar dependências

No diretório 2-postgresql, insira o seguinte comando:

bundle install

Como criar um banco de dados e tabelas

  1. Crie o banco de dados e as tabelas necessárias.

    bundle exec rake db:create
    bundle exec rake db:migrate
    

Como executar o app na máquina local

  1. Inicie um servidor da Web local.

    bundle exec rails server
    
  2. No navegador da Web, digite este endereço:

    http://localhost:3000

Agora, navegue nas páginas da Web do aplicativo para adicionar, editar e excluir livros.

Para sair do servidor da Web local, pressione Control+C.

Como implantar o app no ambiente flexível do App Engine

  1. Compile os recursos do JavaScript para produção.

    RAILS_ENV=production bundle exec rake assets:precompile
    
  2. Implante o app de amostra.

    gcloud app deploy
    
  3. No navegador da Web, digite o endereço a seguir.

    https://[YOUR_PROJECT_ID].appspot.com
    

Atualize o app e implante a versão atualizada com o mesmo comando usado para implantá-lo pela primeira vez. A implantação cria uma nova versão do app e a define como padrão. As versões mais antigas são mantidas, bem como as instâncias de VM associadas. Lembre-se de que essas versões do aplicativo e instâncias de VM são recursos passíveis de cobrança.

Reduza os custos excluindo as versões não padrão do app.

Para excluir uma versão do app:

  1. No Console do GCP, acesse a página "Versões do App Engine".

    Acessar a página Versões

  2. Clique na caixa de seleção ao lado da versão do aplicativo não padrão que você quer excluir.
  3. Clique no botão Excluir na parte superior da página para excluir a versão do aplicativo.

Para informações detalhadas sobre a remoção de recursos faturáveis, consulte a seção Como fazer a limpeza na etapa final deste tutorial.

Estrutura do app

O diagrama a seguir mostra os componentes do aplicativo e como eles se relacionam.

Auth sample structure

Noções básicas sobre o código

Esta seção analisa o código do aplicativo e explica como ele funciona.

Listar livros

Ao visitar a página inicial do aplicativo, você é direcionado para a ação index da classe BooksController. Isso é configurado no arquivo config/routes.rb.

Rails.application.routes.draw do

  # Route root of application to BooksController#index action
  root "books#index"

  # Restful routes for BooksController
  resources :books

end

A ação BookController#index recupera uma lista de livros do banco de dados do Cloud SQL. O aplicativo lista no máximo 10 livros em cada página da Web. Então, a lista depende da página que o usuário está visualizando. Por exemplo, suponha que há 26 livros no banco de dados e o usuário está na terceira página (/?page=3). Nesse caso, params[:page] é igual a 3, que é atribuído à variável page_number. Isso resulta em uma lista de seis livros, começando no deslocamento 20, recuperada e atribuída a @books.

class BooksController < ApplicationController

  PER_PAGE = 10

  def index
    page_number = params[:page] ? params[:page].to_i : 1
    book_offset = PER_PAGE * (page_number - 1)
    @books      = Book.limit(PER_PAGE).offset(book_offset)
    @next_page  = page_number + 1 if @books.count == PER_PAGE
  end

A classe Book é um modelo simples de ActiveRecord que representa um livro individual na tabela de livros.

class Book < ActiveRecord::Base
  validates :title, presence: true
end

No arquivo routes.rb, a chamada de resources :books configura rotas com recursos RESTful para criação, leitura, atualização e exclusão de livros que são direcionadas para as ações correspondentes na classe BooksController.

Depois que BooksController.index recupera uma lista de livros, o código do Ruby incorporado no arquivo books/index.html.erb renderiza a lista.

<% @books.each do |book| %>
  <div class="media">
    <%= link_to book_path(book) do %>
      <div class="media-body">
        <h4><%= book.title %></h4>
        <p><%= book.author %></p>
      </div>
    <% end %>
  </div>
<% end %>

<% if @next_page %>
  <nav>
    <ul class="pager">
      <li><%= link_to "More", books_path(page: @next_page) %></li>
    </ul>
  </nav>
<% end %>

Exibir detalhes do livro

Quando você clica em um livro individual na página da Web, a ação BookController#show o recupera da tabela correspondente, com a respectiva especificação de código.

def show
  @book = Book.find params[:id]
end

Em seguida, o código do Ruby incorporado no arquivo show.html.erb mostra os detalhes do livro.

<div class="media">
  <div class="media-body">
    <h4><%= @book.title %> | &nbsp; <small><%= @book.published_on %></small></h4>
    <h5>By <%= @book.author || "unknown" %></h5>
    <p><%= @book.description %></p>
  </div>
</div>

Criar livros

Ao clicar em Add book na página da Web, a ação BooksController#new cria um novo livro. O código do Ruby incorporado no arquivo new.html.erb aponta para _form.html.erb, que exibe o formulário para inclusão de um novo livro.

<%= form_for @book do |f| %>
  <div class="form-group">
    <%= f.label :title %>
    <%= f.text_field :title %>
  </div>
  <div class="form-group">
    <%= f.label :author %>
    <%= f.text_field :author %>
  </div>
  <div class="form-group">
    <%= f.label :published_on, "Date Published" %>
    <%= f.date_field :published_on %>
  </div>
  <div class="form-group">
    <%= f.label :description %>
    <%= f.text_area :description %>
  </div>
  <button class="btn btn-success" type="submit">Save</button>
<% end %>

Quando você envia o formulário, a ação BooksController#create salva o livro no banco de dados. Se o novo livro for salvo com êxito, a página dele será exibida. Caso contrário, o formulário será exibido novamente com mensagens de erro. O método book_params usa parâmetros fortes (em inglês) para especificar quais campos do formulário são permitidos. Neste caso, somente o título, o autor, a data de publicação e a descrição do livro são permitidos.

def create
  @book = Book.new book_params

  if @book.save
    flash[:success] = "Added Book"
    redirect_to book_path(@book)
  else
    render :new
  end
end

private

def book_params
  params.require(:book).permit(:title, :author, :published_on, :description)
end

Editar livros

Ao clicar em Edit book na página da Web, a ação BooksController#update recupera o livro no banco de dados. O código do Ruby incorporado no arquivo edit.html.erb aponta para _form.html.erb, que exibe o formulário para editar o livro.

def update
  @book = Book.find params[:id]

  if @book.update book_params
    flash[:success] = "Updated Book"
    redirect_to book_path(@book)
  else
    render :edit
  end
end

Quando você envia o fomulário, a ação BooksController#update salva o livro no banco de dados. Se o novo livro for salvo com êxito, a página dele será exibida. Caso contrário, o formulário será exibido novamente com mensagens de erro.

Excluir livros

Ao clicar em Delete Book na página da Web, a ação BooksController#destroy exclui o livro do banco de dados e exibe a lista dos restantes.

def destroy
  @book = Book.find params[:id]
  @book.destroy
  redirect_to books_path
end
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…