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.