sampope 8: Como usar a mágica do Scaffold para criar um CRUD numa aplicação Rails?

Criando CRUD com a mágica do Scaffold no Rails

CRUD (create, read, update, delete) é o esqueleto básico de qualquer aplicação, praticamente a razão que a maioria existe. Afinal, criar registros que depois são "puxados" para relatórios e/ou cálculos é o que a maioria das pessoas querem quando usam e/ou buscam sistemas.

Para quem já desenvolve em outra linguagem isso não é novidade. E nem deve ser a parte da qual mais gosta. Vamos jogar aberto?

CRUD, apesar de necessário, é meio chato, né? É uma tarefa que podemos chamar de repetitiva. Claro que em geral as classes e os objetos ficam mais complexos e nos desafiam a buscar lógicas e soluções criativas, porém, na essência, todo CRUD é igual:
  • Create = Criação, pegue estas informações e crie dados no banco
  • Read = Consulta, traga estes dados e mostre-os de alguma forma
  • Update = Atualização, mude alguma informação nos dados
  • Delete = Destruição: pode acabar com tudo, não preciso mais destes dados
Para fugirmos da parte repetitiva, e podermos focar nossos esforços nas questões peculiares e/ou de fato inovadoras da nossa aplicação, o Rails nos oferece a magia do Scaffold! Este motor do Rails faz todo o básico do CRUD para nós! Depois a gente só incrementa e customiza conforme a necessidade da aplicação!

Vamos lá?

Para começar temos que ter uma aplicação Rails criada. Nesta série nós fizemos isso no primeiro post.

1 - Rode o comando 'rails generate scaffold'

Este é o comando que vai mandar o Rails criar tudo no nosso CRUD, mas precisamos acrescentar os detalhes como o nome da classe e os campos que ela deverá ter.

No meu caso, a aplicação sampope é um pet project com foco em soluções para turismo. Esta primeira coisa a ser criada será simplesmente chamada de Item.

Um item desta aplicação vai se referir a algo que será vendido. Poderá ser um passeio, um serviço de transporte, ou qualquer outra coisa que fará parte dos roteiros e das vendas. Neste primeiro momento, ele terá apenas nome (name) e preço (price).

O comando completo ficará assim:
rails generate scaffold Item name price:integer

Este comando diz: "Rails, por favor crie todo o CRUD para uma classe chamada Item que tem os atributos nome e preço, sendo que preço é um número."

Note que para price, nós especificamos integer e para name não especificamos nada. Isso é porque na ausência do tipo de dado, o Rails usará seu padrão, que é string, resultando numa coluna do tipo VARCHAR sendo criada no banco de dados. 

Quando a gente rodar o comando, o Rails vai nos avisar das várias coisas que está fazendo. Veja abaixo o que apareceu para mim. Ao longo do desenvolvimento da nossa aplicação vamos aprender mais sobre cada um destes passos.

vivipoit ~/Projects/sampope (master)
> rails generate scaffold Item name price:integer
Running via Spring preloader in process 2540
      invoke  active_record
      create    db/migrate/20200519100714_create_items.rb
      create    app/models/item.rb
      invoke    rspec
      create      spec/models/item_spec.rb
      invoke  resource_route
       route    resources :items
      invoke  scaffold_controller
      create    app/controllers/items_controller.rb
      invoke    erb
      create      app/views/items
      create      app/views/items/index.html.erb
      create      app/views/items/edit.html.erb
      create      app/views/items/show.html.erb
      create      app/views/items/new.html.erb
      create      app/views/items/_form.html.erb
      invoke    rspec
      create      spec/requests/items_spec.rb
      create      spec/views/items/edit.html.erb_spec.rb
      create      spec/views/items/index.html.erb_spec.rb
      create      spec/views/items/new.html.erb_spec.rb
      create      spec/views/items/show.html.erb_spec.rb
      create      spec/routing/items_routing_spec.rb
      invoke    helper
      create      app/helpers/items_helper.rb
      invoke      rspec
      create        spec/helpers/items_helper_spec.rb
      invoke    jbuilder
      create      app/views/items/index.json.jbuilder
      create      app/views/items/show.json.jbuilder
      create      app/views/items/_item.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/items.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

2 - Rode o comando 'rails db:migrate'

Um dos arquivos criados na ação acima foi o que chamamos de migration, que guarda instruções sobre o que deve ser criado no banco de dados. Rodamos o comando rails db:migrate para executar estas instruções e nos certificar de que está tudo em ordem para os nossos dados serem criados e manipulados lá.

vivipoit ~/Projects/sampope (master)
> rails db:migrate
== 20200519100714 CreateItems: migrating ======================================
-- create_table(:items)
   -> 0.0118s
== 20200519100714 CreateItems: migrated (0.0119s) =============================

Pronto!

É só isso! Agora nós podemos rodar rails s e navegar a nossa aplicação para ver que temos uma index para itens, que podemos criar itens, atualizar informações dos itens, e até excluir alguns! Tudo isso agora existe por causa de apenas 2 comandos!


Nenhum comentário:

Postar um comentário

E depois que seu código funciona, o que mais ele pode fazer?

Conhecer um idioma e se comunicar bem nele são a mesma coisa? Nem sempre, né? Você pode saber vocabulário, gramática, e até gírias, mas se n...