Como construir uma aplicação Ruby on Rails

Introdução

Rails é um framework de aplicações web escrito em Ruby. Adota uma abordagem opinativa para o desenvolvimento de aplicações, assumindo que convenções estabelecidas melhor servem os desenvolvedores onde há um objetivo comum. Assim, o Rails oferece convenções para lidar com roteamento, dados stateful, gerenciamento de ativos e mais, para fornecer a funcionalidade básica que a maioria das aplicações web precisa.

O Rails segue o padrão arquitetônico model-view-controller (MVC), que separa a lógica da aplicação, localizada nos modelos, do roteamento e apresentação das informações da aplicação. Essa estrutura organizacional — junto com outras convenções que permitem aos desenvolvedores extrair código para helpers e partials — garante que o código da aplicação não seja repetido desnecessariamente.

Neste tutorial, você construirá uma aplicação Rails que permitirá aos usuários postar informações sobre tubarões e seu comportamento. Será um bom ponto de partida para o desenvolvimento futuro de aplicações.

Pré-requisitos

Para seguir este tutorial, você precisará de:

  • Uma máquina local ou servidor de desenvolvimento rodando Ubuntu 18.04. Sua máquina de desenvolvimento deve ter um usuário não root com privilégios administrativos e um firewall configurado com ufw. Para instruções sobre como configurar isso, consulte nosso tutorial Configuração Inicial do Servidor com Ubuntu 18.04.
  • Node.js e npm instalados em sua máquina local ou servidor de desenvolvimento. Este tutorial usa Node.js versão 10.16.3 e npm versão 6.9.0. Para orientações sobre a instalação de Node.js e npm no Ubuntu 18.04, siga as instruções na seção “Instalando Usando um PPA” de Como Instalar Node.js no Ubuntu 18.04.
  • Ruby, rbenv, e Rails instalados em sua máquina local ou servidor de desenvolvimento, seguindo os Passos 1-4 em Como Instalar Ruby on Rails com rbenv no Ubuntu 18.04. Este tutorial utiliza Ruby 2.5.1, rbenv 1.1.2, e Rails 5.2.0.

Passo 1 — Instalando SQLite3

Antes de criar nossa aplicação Rails shark, precisamos garantir que temos um banco de dados para armazenar dados do usuário. Rails está configurado para usar SQLite por padrão, e isso geralmente é uma boa escolha no desenvolvimento. Como os dados da nossa aplicação não requerem alta extensibilidade programática, SQLite atenderá às nossas necessidades.

Primeiro, atualize seu índice de pacotes:

  1. sudo apt update

Em seguida, instale os pacotes sqlite3 e libsqlite3-dev:

sudo apt install sqlite3 libsqlite3-dev

Isso instalará tanto SQLite quanto seus arquivos de desenvolvimento necessários.

Verifique sua versão para confirmar que a instalação foi bem-sucedida:

  1. sqlite3 --version
Output
3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt1

Com o SQLite instalado, você está pronto para começar a desenvolver sua aplicação.

Passo 2 — Criando um Novo Projeto Rails

Com nosso banco de dados instalado, podemos criar um novo projeto Rails e examinar algum código boilerplate padrão que Rails nos fornece com o rails new comando.

Crie um projeto chamado sharkapp com o seguinte comando:

  1. rails new sharkapp

Você verá uma boa quantidade de saída informando o que Rails está criando para seu novo projeto. A saída abaixo destaca alguns arquivos, diretórios e comandos significativos:

Output
create . . . create Gemfile . . . create app . . . create app/controllers/application_controller.rb . . . create app/models/application_record.rb . . . create app/views/layouts/application.html.erb . . . create config create config/routes.rb create config/application.rb . . . create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb . . . create config/database.yml create db create db/seeds.rb . . . run bundle install . . . Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. . . . * bin/rake: Spring inserted * bin/rails: Spring inserted

A saída destacada aqui informa que Rails criou o seguinte:

  • Gemfile: Este arquivo lista as dependências de gemas para sua aplicação. Uma gema é um pacote de software Ruby, e um Gemfile permite que você gerencie as necessidades de software do seu projeto.
  • app: O diretório app é onde reside o código principal da sua aplicação. Isso inclui os modelos, controladores, visões, ativos, ajudantes e correio que compõem a própria aplicação. Rails fornece algum boilerplate no nível da aplicação para o modelo MCV para começar em arquivos como app/models/application_record.rb, app/controllers/application_controller.rb, e app/views/layouts/application.html.erb.
  • config: Este diretório contém as configurações do seu aplicativo:
    • config/routes.rb: As declarações de rotas do seu aplicativo estão neste arquivo.
    • config/application.rb: As configurações gerais para os componentes do seu aplicativo estão localizadas neste arquivo.
  • config/environments: Este diretório é onde as configurações para seus ambientes estão localizadas. Rails inclui três ambientes por padrão: development, production e test.
  • config/database.yml: As configurações do banco de dados estão neste arquivo, que é dividido em quatro seções: default, development, production e test. Graças ao Gemfile que veio com o comando rails new, que incluiu a gem sqlite3, nosso arquivo config/database.yml já tem o parâmetro adapter definido como sqlite3, especificando que usaremos um banco de dados SQLite com este aplicativo.
  • db: Esta pasta inclui um diretório para migrações de banco de dados chamado migrate, junto com os arquivos schema.rb e seeds.rb. schema.db contém informações sobre seu banco de dados, enquanto seeds.rb é onde você pode colocar dados iniciais para o banco de dados.

Finalmente, o Rails executa o comando bundle install para instalar as dependências listadas em seu Gemfile.

Depois que tudo estiver configurado, navegue até o diretório sharkapp:

  1. cd sharkapp

Agora você pode iniciar o servidor Rails para garantir que sua aplicação está funcionando, usando o comando rails server. Se estiver trabalhando em sua máquina local, digite:

  1. rails server

Rails se vincula a localhost por padrão, então você pode acessar sua aplicação navegando no seu navegador para localhost:3000, onde verá a seguinte imagem:

Se estiver trabalhando em um servidor de desenvolvimento, primeiro certifique-se de que conexões são permitidas na porta 3000:

  1. sudo ufw allow 3000

Então inicie o servidor com a flag --binding, para vincular ao IP do seu servidor:

  1. rails server --binding=your_server_ip

Navegue para http://seu_ip_do_servidor:3000 no seu navegador, onde verá a mensagem de boas-vindas do Rails.

Depois de dar uma olhada ao redor, você pode parar o servidor com CTRL+C.

Com sua aplicação criada e no lugar, você está pronto para começar a construir a partir do boilerplate do Rails para criar uma aplicação única.

Passo 3 — Scaffolding da Aplicação

Para criar nossa aplicação de informações sobre tubarões, precisaremos criar um modelo para gerenciar os dados da nossa aplicação, visualizações para permitir a interação do usuário com esses dados e um controlador para gerenciar a comunicação entre o modelo e as visualizações. Para construir essas coisas, usaremos o comando rails generate scaffold, que nos fornecerá um modelo, uma migração de banco de dados para alterar o esquema do banco de dados, um controlador, um conjunto completo de visualizações para gerenciar Criar, Ler, Atualizar e Deletar (CRUD) operações para a aplicação, e modelos para partials, helpers e testes.

Como o comando generate scaffold faz muito trabalho para nós, vamos dar uma olhada mais detalhada nos recursos que ele cria para entender o trabalho que o Rails está fazendo por debaixo dos panos.

Nosso comando generate scaffold incluirá o nome do nosso modelo e os campos que desejamos em nossa tabela de banco de dados. O Rails utiliza Active Record para gerenciar relações entre os dados do aplicativo, construídos como objetos com modelos, e o banco de dados do aplicativo. Cada um de nossos modelos é uma classe Ruby, mas também herda da classe ActiveRecord::Base. Isso significa que podemos trabalhar com nossa classe de modelo da mesma maneira que trabalharíamos com uma classe Ruby, além de incorporar métodos do Active Record. O Active Record então garantirá que cada classe seja mapeada para uma tabela em nosso banco de dados e cada instância dessa classe para uma linha nessa tabela.

Digite o seguinte comando para gerar um modelo Shark, controlador e visualizações associadas:

  1. rails generate scaffold Shark name:string facts:text

Com name:string e facts:text, estamos fornecendo ao Rails informações sobre os campos que gostaríamos em nossa tabela de banco de dados e o tipo de dados que devem aceitar. Ambos nos darão espaço para inserir o que desejamos, embora text permita mais caracteres para fatos sobre tubarões.

Quando você digitar este comando, verá novamente uma longa lista de saída que explica tudo o que o Rails está gerando para você. A saída abaixo destaca algumas das coisas mais significativas para nossa configuração:

Output
invoke active_record create db/migrate/20190804181822_create_sharks.rb create app/models/shark.rb . . . invoke resource_route route resources :sharks invoke scaffold_controller create app/controllers/sharks_controller.rb invoke erb create app/views/sharks create app/views/sharks/index.html.erb create app/views/sharks/edit.html.erb create app/views/sharks/show.html.erb create app/views/sharks/new.html.erb create app/views/sharks/_form.html.erb . . .

O Rails criou o modelo em app/models/shark.rb e uma migração de banco de dados para acompanhá-lo: db/migrate/20190804181822_create_sharks.rb. O timestamp no seu arquivo de migração será diferente do que você vê aqui.

Também criou um controlador, app/controllers/sharks_controller.rb, bem como as visualizações associadas às operações CRUD do nosso aplicativo, coletadas em app/views/sharks. Entre essas visualizações, há uma parcial, _form.html.erb, que contém código usado em várias visualizações.

Por fim, o Rails adicionou uma nova rota resourceful, resources :sharks, a config/routes.rb. Isso permite que o roteador do Rails combine solicitações HTTP de entrada com o controlador sharks e suas visualizações associadas.

Embora o Rails tenha feito grande parte do trabalho de construir o código do nosso aplicativo para nós, vale a pena dar uma olhada em alguns arquivos para entender o que está acontecendo.

Primeiro, vamos examinar o arquivo do controlador com o seguinte comando:

  1. cat app/controllers/sharks_controller.rb
Output
class SharksController < ApplicationController before_action :set_shark, only: [:show, :edit, :update, :destroy] # GET /sharks # GET /sharks.json def index @sharks = Shark.all end # GET /sharks/1 # GET /sharks/1.json def show end # GET /sharks/new def new @shark = Shark.new end # GET /sharks/1/edit def edit end # POST /sharks # POST /sharks.json def create @shark = Shark.new(shark_params) respond_to do |format| if @shark.save format.html { redirect_to @shark, notice: 'Shark was successfully created.' } format.json { render :show, status: :created, location: @shark } else format.html { render :new } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # PATCH/PUT /sharks/1 # PATCH/PUT /sharks/1.json def update respond_to do |format| if @shark.update(shark_params) format.html { redirect_to @shark, notice: 'Shark was successfully updated.' } format.json { render :show, status: :ok, location: @shark } else format.html { render :edit } format.json { render json: @shark.errors, status: :unprocessable_entity } end end end # DELETE /sharks/1 # DELETE /sharks/1.json def destroy @shark.destroy respond_to do |format| format.html { redirect_to sharks_url, notice: 'Shark was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_shark @shark = Shark.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def shark_params params.require(:shark).permit(:name, :facts) end end

O controlador é responsável por gerenciar como as informações são buscadas e passadas para seu modelo associado, e como elas são associadas a visualizações específicas. Como você pode ver, nosso controlador sharks inclui uma série de métodos que mapeiam aproximadamente para operações CRUD padrão. No entanto, há mais métodos do que funções CRUD, para permitir eficiência no caso de erros.

Por exemplo, considere o método create:

~/sharkapp/app/controllers/sharks_controller.rb
. . .
  def create
    @shark = Shark.new(shark_params)

    respond_to do |format|
      if @shark.save
        format.html { redirect_to @shark, notice: 'Shark was successfully created.' }
        format.json { render :show, status: :created, location: @shark }
      else
        format.html { render :new }
        format.json { render json: @shark.errors, status: :unprocessable_entity }
      end
    end
  end
. . . 

Se uma nova instância da classe Shark for salva com sucesso, redirect_to gerará uma nova requisição que será direcionada ao controlador. Esta será uma requisição GET, e será tratada pelo método show, que mostrará ao usuário o tubarão que eles acabaram de adicionar.

Se houver uma falha, o Rails renderizará novamente o template app/views/sharks/new.html.erb em vez de fazer outra requisição ao roteador, dando aos usuários outra chance de enviar seus dados.

Além do controlador de tubarões, o Rails nos forneceu um modelo para uma visualização index, que mapeia para o método index em nosso controlador. Vamos usar isso como a visualização raiz de nossa aplicação, por isso vale a pena dar uma olhada.

Digite o seguinte para exibir o arquivo:

  1. cat app/views/sharks/index.html.erb
Output
<p id="notice"><%= notice %></p> <h1>Sharks</h1> <table> <thead> <tr> <th>Name</th> <th>Facts</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @sharks.each do |shark| %> <tr> <td><%= shark.name %></td> <td><%= shark.facts %></td> <td><%= link_to 'Show', shark %></td> <td><%= link_to 'Edit', edit_shark_path(shark) %></td> <td><%= link_to 'Destroy', shark, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'New Shark', new_shark_path %>

A visualização index itera sobre as instâncias de nossa classe Shark, que foram mapeadas para a tabela sharks em nosso banco de dados. Usando modelagem ERB, a visualização exibe cada campo da tabela que está associado a uma instância individual de tubarão: name e facts.

A visualização então usa o auxiliar link_to para criar um hiperlink, com a string fornecida como texto do link e o caminho fornecido como destino. Os próprios caminhos são possíveis graças aos auxiliares que ficaram disponíveis para nós quando definimos a rota sharks com a rota com recursos com o comando rails generate scaffold.

Além de analisar nossa visualização index, também podemos dar uma olhada na visualização new para ver como o Rails usa parcialmente nas visualizações. Digite o seguinte para exibir o modelo app/views/sharks/new.html.erb:

  1. cat app/views/sharks/new.html.erb
Output
<h1>New Shark</h1> <%= render 'form', shark: @shark %> <%= link_to 'Back', sharks_path %>

Embora este modelo possa parecer não ter campos de entrada para um novo registro de tubarão, a referência a render 'form' indica que o modelo está incorporando o parcial _form.html.erb, que extrai código repetido em várias visualizações.

Ao examinar esse arquivo, teremos uma compreensão completa de como uma nova instância de tubarão é criada:

  1. cat app/views/sharks/_form.html.erb
Output
<%= form_with(model: shark, local: true) do |form| %> <% if shark.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(shark.errors.count, "error") %> prohibited this shark from being saved:</h2> <ul> <% shark.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :name %> <%= form.text_field :name %> </div> <div class="field"> <%= form.label :facts %> <%= form.text_area :facts %> </div> <div class="actions"> <%= form.submit %> </div> <% end %>

Este modelo utiliza o form_with auxiliar de formulário. Auxiliares de formulário são projetados para facilitar a criação de novos objetos a partir de entradas do usuário, utilizando os campos e o escopo de modelos específicos. Aqui, form_with recebe model: shark como argumento, e o novo objeto construtor de formulário que ele cria possui entradas de campo que correspondem aos campos na tabela sharks. Assim, os usuários têm campos de formulário para inserir tanto o name quanto os facts do tubarão.

O envio deste formulário criará uma resposta JSON com os dados do usuário, que o restante da sua aplicação pode acessar através do método params, que cria um objeto ActionController::Parameters com esses dados.

Agora que você sabe o que rails generate scaffold produziu para você, pode prosseguir para definir a visualização raiz da sua aplicação.

Etapa 4 — Criando a Visualização Raiz do Aplicativo e Testando a Funcionalidade

Idealmente, você deseja que a página de destino do seu aplicativo corresponda à raiz do aplicativo, para que os usuários possam imediatamente ter uma noção do propósito do aplicativo.

Existem várias maneiras de lidar com isso: por exemplo, você poderia criar um controlador Welcome e uma visualização associada index, que forneceria aos usuários uma página de destino genérica que também poderia vincular a diferentes partes do aplicativo. No nosso caso, no entanto, fazer com que os usuários desembarquem em nossa visualização index de tubarões será uma introdução suficiente ao propósito do aplicativo por enquanto.

Para configurar isso, você precisará modificar as configurações de roteamento em config/routes.rb para especificar a raiz do aplicativo.

Abra config/routes.rb para edição, usando nano ou seu editor favorito:

  1. nano config/routes.rb

O arquivo ficará assim:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks
  # Para detalhes sobre o DSL disponível neste arquivo, consulte http://guides.rubyonrails.org/routing.html
end

Sem definir algo mais específico, a visualização padrão em http://localhost:3000 ou http://seu_ip_do_servidor:3000 será a página de boas-vindas padrão do Rails.

Para mapear a visualização raiz do aplicativo para a visualização index do controlador sharks, você precisará adicionar a seguinte linha ao arquivo:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks

  root 'sharks#index' 
  # Para detalhes sobre o DSL disponível neste arquivo, consulte http://guides.rubyonrails.org/routing.html
end

Agora, quando os usuários navegarem até a raiz do seu aplicativo, eles verão uma lista completa de tubarões e terão a oportunidade de criar uma nova entrada de tubarão, ver entradas existentes e editar ou excluir entradas específicas.

Salve o arquivo e saia do seu editor quando terminar de editar. Se você usou nano para editar o arquivo, pode fazer isso pressionando CTRL+X, Y, depois ENTER.

Agora você pode executar suas migrações com o seguinte comando:

  1. rails db:migrate

Você verá a saída confirmando a migração.

Inicie seu servidor Rails novamente. Se estiver trabalhando localmente, digite:

  1. rails s

Em um servidor de desenvolvimento, digite:

  1. rails s --binding=your_server_ip

Navegue para localhost:3000 se estiver trabalhando localmente, ou http://seu_ip_do_servidor:3000 se estiver trabalhando em um servidor de desenvolvimento.

A página de destino do seu aplicativo ficará assim:

Para criar um novo tubarão, clique no link New Shark no final da página, que o levará à rota sharks/new:

Vamos adicionar algumas informações de demonstração para testar nosso aplicativo. Insira “Baleia Branca” no campo Name e “Assustador” no campo Facts:

Clique no botão Create para criar o tubarão.

Este irá direcionar você para a rota de show, que, graças ao filtro before_action, está definido com o método set_shark, o qual captura o id do tubarão que acabou de ser criado:

~/sharkapp/app/controllers/sharks_controller.rb
class SharksController < ApplicationController
  before_action :set_shark, only: [:show, :edit, :update, :destroy]

  . . . 

  def show
  end

  . . . 

  private
    # Usa callback para compartilhar configurações ou restrições comuns entre ações.
    def set_shark
      @shark = Shark.find(params[:id])
    end
  . . .

Você pode testar agora a função de editar clicando Editar na entrada do tubarão. Isso levará você à rota de edit para esse tubarão:

Altere as facts sobre o Rei-do-mar para ler “Grande” em vez de “Assustador” e clique Atualizar Tubarão. Isso levará você de volta à rota de show:

Finalmente, clique Voltar para levar você à sua visualização atualizada da index:

Agora que você testou a funcionalidade básica do seu aplicativo, você pode adicionar algumas validações e verificações de segurança para tornar tudo mais seguro.

O seu aplicativo de tubarões pode receber inputs dos usuários, mas imaginem um caso em que um usuário tenta criar um tubarão sem adicionar fatos a ele, ou criar uma entrada de um tubarão que já está no banco de dados. Você pode criar mecanismos para checar dados de entrada antes que eles sejam inseridos no banco de dados adicionando validações aos modelos. Como a lógica do seu aplicativo está localizada nos seus modelos, validações aqui fazem mais sentido do que em outros lugares do aplicativo.

Note que não abordaremos a escrita de testes de validação neste tutorial, mas você pode descobrir mais sobre testes consultando a documentação do Rails.

Se ainda não parou o servidor, vá em frente e faça isso digitando CTRL+C.

Abra seu arquivo de modelo shark.rb:

  1. nano app/models/shark.rb

Atualmente, o arquivo nos diz que a classe Shark herda de ApplicationRecord, que por sua vez herda de ActiveRecord::Base:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
end

Vamos primeiro adicionar algumas validações ao nosso campo name para confirmar que o campo está preenchido e que a entrada é única, evitando entradas duplicadas:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
end

Em seguida, adicione uma validação para o campo facts para garantir que ele também esteja preenchido:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

Estamos menos preocupados aqui com a unicidade dos fatos, desde que estejam associados a entradas de tubarões únicos.

Salve e feche o arquivo quando terminar.

Inicie seu servidor novamente com rails s ou rails s --binding=your_server_ip, dependendo se você está trabalhando localmente ou com um servidor de desenvolvimento.

Navegue até a raiz do seu aplicativo em http://localhost:3000 ou http://your_server_ip:3000.

Clique em Novo Tubarão. No formulário, adicione “Tubarão Branco” ao campo Nome e “Grandes Dentes” ao campo Fatos, e então clique em Criar Tubarão. Você deve ver o seguinte aviso:

Agora, vamos ver se podemos verificar nossa outra validação. Clique Voltar para retornar à página inicial, e depois Novo Tubarão novamente. No novo formulário, insira “Tubarão-tigre” no campo Nome, e deixe Fatos em branco. Clicar em Criar Tubarão irá disparar o seguinte aviso:

Com essas mudanças, sua aplicação tem algumas validações em vigor para garantir a consistência dos dados que são salvos no banco de dados. Agora você pode se concentrar nos usuários da sua aplicação e definir quem pode modificar os dados da aplicação.

Passo 6 — Adicionando Autenticação

Com validações em vigor, temos algumas garantias sobre os dados que estão sendo salvos no banco de dados. Mas e quanto aos usuários? Se não quisermos que qualquer e todos os usuários adicionem ao banco de dados, então devemos adicionar algumas medidas de autenticação para garantir que apenas usuários autorizados possam adicionar tubarões. Para fazer isso, usaremos o http_basic_authenticate_with método, que nos permitirá criar uma combinação de nome de usuário e senha para autenticar os usuários.

Existem várias maneiras de autenticar usuários com Rails, incluindo trabalhar com as gemas bcrypt ou devise. Por enquanto, no entanto, adicionaremos um método ao nosso controlador de aplicação que se aplicará a ações em toda a nossa aplicação. Isso será útil se adicionarmos mais controladores à aplicação no futuro.

Pare seu servidor novamente com CTRL+C.

Abra o arquivo que define seu ApplicationController:

  1. nano app/controllers/application_controller.rb

Dentro, você verá a definição da classe ApplicationController, da qual os outros controladores em sua aplicação herdam:

~/sharkapp/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
end

Para autenticar usuários, usaremos um nome de usuário e senha codificados com o método http_basic_authenticate_with. Adicione o seguinte código ao arquivo:

~/sharkapp/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  http_basic_authenticate_with name: 'sammy', password: 'shark', except: [:index, :show]
end

Além de fornecer o nome de usuário e senha aqui, também restringimos a autenticação especificando as rotas onde ela não deve ser necessária: index e show. Outra maneira de conseguir isso seria escrever only: [:create, :update, :destroy]. Dessa forma, todos os usuários poderão olhar todos os tubarões e ler fatos sobre tubarões específicos. No entanto, quando se trata de modificar o conteúdo do site, os usuários precisarão provar que têm acesso.

Em uma configuração mais robusta, você não desejaria codificar valores dessa maneira, mas para fins de demonstração, isso permitirá que você veja como pode incluir autenticação para as rotas de sua aplicação. Também permite que você veja como o Rails armazena dados de sessão por padrão em cookies: uma vez que você se autentique em uma ação especificada, não será necessário se autenticar novamente na mesma sessão.

Salve e feche app/controllers/application_controller.rb quando terminar de editar. Agora você pode testar a autenticação em ação.

Inicie o servidor com rails s ou rails s --binding=seu_servidor_ip e navegue até sua aplicação em http://localhost:3000 ou http://seu_servidor_ip:3000.

Na página inicial, clique no botão Novo Shark. Isso acionará a seguinte janela de autenticação:

Se você inserir a combinação de nome de usuário e senha que adicionou em app/controllers/application_controller.rb, poderá criar um novo shark de forma segura.

Agora você tem uma aplicação de tubarões funcional, completa com validações de dados e um esquema básico de autenticação.

Conclusão

A aplicação Rails que você criou neste tutorial é um ponto de partida que você pode usar para desenvolvimento adicional. Se você estiver interessado em explorar o ecossistema Rails, a documentação do projeto é um ótimo lugar para começar.

Você também pode aprender mais sobre como adicionar recursos aninhados ao seu projeto lendo Como Criar Recursos Aninhados para uma Aplicação Ruby on Rails, que mostrará como construir os modelos e rotas do seu aplicativo.

Além disso, você pode querer explorar como configurar uma interface de usuário mais robusta para o seu projeto com um framework como React. Como Configurar um Projeto Ruby on Rails com um Frontend React oferece orientações sobre como fazer isso.

Se você deseja explorar diferentes opções de banco de dados, também pode conferir Como Usar PostgreSQL com Sua Aplicação Ruby on Rails no Ubuntu 18.04, que explica como trabalhar com PostgreSQL em vez de SQLite. Além disso, você pode consultar nossa biblioteca de tutoriais sobre PostgreSQL para aprender mais sobre o uso deste banco de dados.

Source:
https://www.digitalocean.com/community/tutorials/how-to-build-a-ruby-on-rails-application