Ruby on Rails - Scaffolding

Enquanto você está desenvolvendo aplicações Rails, especialmente aquelas que fornecem principalmente uma interface simples para dados em um banco de dados, muitas vezes pode ser útil usar o método scaffold.

Scaffolding oferece mais do que emoções de demonstração baratas. Aqui estão alguns benefícios -

  • Você pode obter o código rapidamente para seus usuários para feedback.

  • Você é motivado por um sucesso mais rápido.

  • Você pode aprender como o Rails funciona olhando o código gerado.

  • Você pode usar o andaime como base para iniciar seu desenvolvimento.

Exemplo de andaime

Para entender o scaffolding, vamos criar um banco de dados chamadocookbook e uma mesa chamada recipes.

Criando um aplicativo da Web Rails vazio

Abra uma janela de comando e navegue até onde deseja criar este cookbookaplicativo da web. Portanto, execute o seguinte comando para criar uma estrutura de diretório completa.

tp> rails new cookbook

Configurando o Banco de Dados

Aqui está a maneira de criar um banco de dados -

mysql> create database cookbook;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on cookbook.*
to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Para instruir Rails sobre como encontrar o banco de dados, edite o arquivo de configuração cookbook \ config \ database.yml e mude o nome do banco de dados para cookbook. Deixe a senha em branco. Quando terminar, deve ser o seguinte -

development:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost
	
test:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost
	
production:
   adapter: mysql
   database: cookbook
   username: root
   password: [password]
   host: localhost

O Rails permite que você execute no modo de desenvolvimento, modo de teste ou modo de produção, usando diferentes bancos de dados. Este aplicativo usa o mesmo banco de dados para cada um.

O código de andaime gerado

Com a ação de cadafalso, o Rails gera todo o código de que precisa dinamicamente. Ao executar o scaffold como um script, podemos obter todo o código gravado no disco, onde podemos investigá-lo e, em seguida, começar a adaptá-lo aos nossos requisitos.

Então, agora, vamos começar mais uma vez a gerar o código do Scaffold manualmente usando o script auxiliar do scaffold -

cookbook> rails generate scaffold recipe

Ele gera arquivos automáticos conforme mostrado abaixo -

O controlador

Vejamos o código por trás do controlador. Este código é gerado peloscaffoldgerador. Se você abrir app / controllers / recipes_controller.rb, você encontrará algo como a seguir -

class RecipesController < ApplicationController
   before_action :set_recipe, only: [:show, :edit, :update, :destroy]
   
   # GET /recipes
   # GET /recipes.json
   def index
      @recipes = Recipe.all
   end
   
   # GET /recipes/1
   # GET /recipes/1.json
   def show
   end
   
   # GET /recipes/new
   def new
      @recipe = Recipe.new
   end
   
   # GET /recipes/1/edit
   def edit
   end
   
   # POST /recipes
   # POST /recipes.json
   def create
      @recipe = Recipe.new(recipe_params)
      
      respond_to do |format|
         if @recipe.save
            format.html { redirect_to @recipe, notice: 'Recipe was successfully created.' }
            format.json { render :show, status: :created, location: @recipe }
         else
            format.html { render :new }
            format.json { render json: @recipe.errors, status: :unprocessable_entity }
         end
      end
      
   end
   
   # PATCH/PUT /recipes/1
   # PATCH/PUT /recipes/1.json
   def update
      respond_to do |format|
         if @recipe.update(recipe_params)
            format.html { redirect_to @recipe, notice: 'Recipe was successfully updated.' }
            format.json { render :show, status: :ok, location: @recipe }
         else
            format.html { render :edit }
            format.json { render json: @recipe.errors, status: :unprocessable_entity }
         end
      end
      
   end
   
   # DELETE /recipes/1
   # DELETE /recipes/1.json
   def destroy
      @recipe.destroy
         respond_to do |format|
         format.html { redirect_to recipes_url, notice: 'Recipe was successfully destroyed.' }
         format.json { head :no_content }
      end
   end
   
   private
   
   # Use callbacks to share common setup or constraints between actions.
   def set_recipe
      @recipe = Recipe.find(params[:id])
   end
   
   # Never trust parameters from the scary internet, only allow the white list through.
   def recipe_params
      params.require(:recipe).permit(:tittle, :instructions)
   end
end

Quando o usuário de uma aplicação Rails seleciona uma ação, por exemplo "Mostrar" - o controlador irá executar qualquer código na seção apropriada - "def show" - e então por padrão irá renderizar um template com o mesmo nome - "show.html. erb ". Este comportamento padrão pode ser substituído.

O controlador usa métodos ActiveRecord como find, find_all, new, save, update_attributes e destroy para mover dados de e para as tabelas do banco de dados. Observe que você não precisa escrever nenhuma instrução SQL, o rails cuidará disso automaticamente.

Essa única linha de código dará vida à tabela do banco de dados. Ele fornecerá uma interface simples para seus dados e maneiras de -

  • Criação de novas entradas
  • Editando entradas atuais
  • Visualizando entradas atuais
  • Destruindo entradas atuais

Ao criar ou editar uma entrada, o scaffold fará todo o trabalho árduo, como geração e manuseio de formulários, e até fornecerá uma geração inteligente de formulários, suportando os seguintes tipos de entradas -

  • Strings de texto simples
  • Áreas de texto (ou grandes blocos de texto)
  • Seletores de data
  • Seletores de data e hora

Você pode usar Rails Migrations para criar e manter tabelas.

rake db:migrate RAILS_ENV=development

Agora, vá para o diretório do livro de receitas e execute o servidor da Web usando o seguinte comando -

cookbook> rails server

Agora, abra um navegador e navegue até http://127.0.0.1:3000/recipe/new.Isso fornecerá a você uma tela para criar novas entradas na tabela de receitas. Uma captura de tela é mostrada abaixo -

Depois de pressionar o Create botão para criar uma nova receita, seu registro é adicionado à tabela de receitas e mostra o seguinte resultado -

Você pode ver a opção de editar, mostrar e destruir os registros. Portanto, brinque com essas opções.

Você também pode listar todas as receitas disponíveis na tabela de receitas usando o URL http://127.0.0.1:3000/recipe/list.

Aprimorando o modelo

O Rails oferece muito tratamento de erros de graça. Para entender isso, adicione algumas regras de validação ao modelo de receita vazio -

Modifique app / models / recipe.rb como segue e teste seu aplicativo -

class Recipe < ActiveRecord::Base
   validates_length_of :title, :within => 1..20
   validates_uniqueness_of :title, :message => "already exists"
end

Essas entradas darão verificação automática.

  • validates_length_of - o campo não está em branco e não é muito longo.

  • validates_uniqueness_of- valores duplicados são capturados. Em vez da mensagem de erro padrão do Rails, fornecemos uma mensagem personalizada aqui.

Maneira alternativa de criar andaimes

Crie um aplicativo conforme mostrado acima e The Generated Scaffold Code como mostrado abaixo

rails g scaffold Recipe tittle:string instructions:text

O código acima gera os arquivos auto com base de dados usando com sqlite3 com tittle e coluna de instrução como mostrado abaixo uma imagem.

precisamos migrar o banco de dados usando a sintaxe abaixo.

$ rake db:migrate RAILS_ENV=development

Por fim, execute o aplicativo usando a seguinte linha de comando -

rails server

Ele irá gerar o resultado conforme as imagens de saída mostradas acima.

As visualizações

Todas as visualizações e todos os métodos do controlador correspondentes são criados por scaffold comando e eles estão disponíveis no diretório app / views / recipes.

Como o andaime é diferente?

Se você leu os capítulos anteriores, deve ter visto que criamos métodos para listar, mostrar, excluir e criar dados, etc., mas o scaffolding faz esse trabalho automaticamente.