Aprenda / Ruby on Rails

FundamentosAula 3 de 2016 min0% da trilha

Scaffold: gerando um recurso e entendendo cada arquivo

Um comando gera model, migration, controller e rotas — entender o que cada arquivo faz é o objetivo.

scaffold é o gerador mais completo do Rails: um comando cria model, migration, controller, rotas e (em app tradicional) views. Numa API, view não entra — mas todo o resto sim. O objetivo aqui não é decorar o comando, é entender pra que serve cada arquivo que ele cria.

terminal
rails generate scaffold Produto nome:string preco:decimal --api

--api pede a variante pra API (sem view HTML). nome:string preco:decimal já define as colunas da tabela — Rails escreve a migration a partir disso.

O que cada arquivo gerado faz

db/migrate/..._create_produtos.rb
class CreateProdutos < ActiveRecord::Migration[7.1]
  def change
    create_table :produtos do |t|
      t.string :nome
      t.decimal :preco
      t.timestamps               # cria created_at e updated_at sozinho
    end
  end
end
app/models/produto.rb
class Produto < ApplicationRecord
end

Um model Rails começa vazio — herdar de ApplicationRecord já dá acesso a todo CRUD (Produto.all, Produto.find(1), Produto.create(...)) sem escrever SQL nenhum. Validação e associação entram depois, na próxima lição.

config/routes.rb
Rails.application.routes.draw do
  resources :produtos   # gera as 7 rotas REST padrão de uma vez (próxima lição)
end
app/controllers/produtos_controller.rb (resumido)
class ProdutosController < ApplicationController
  def index
    render json: Produto.all
  end

  def show
    render json: Produto.find(params[:id])
  end

  def create
    produto = Produto.create(produto_params)
    render json: produto, status: :created
  end

  private

  def produto_params
    params.require(:produto).permit(:nome, :preco)
  end
end

produto_params é o strong parameters do Rails: exige que o JSON venha aninhado sob produto e permite explicitamente só nome/preco — qualquer outro campo enviado (tipo um admin: true malicioso) é silenciosamente descartado. Isso não é detalhe cosmético: é a primeira linha de defesa contra mass assignment.

Exercício

Rode rails generate scaffold Categoria nome:string --api mentalmente: quais 4 arquivos seriam criados, e o que cada um teria de diferente em relação ao exemplo de Produto acima?

Quiz rápido

O que faz produto_params (strong parameters) no controller gerado?
Por que app/models/produto.rb começa vazio, sem métodos?