Curtidas ❤️

O desafio

Cada recado ganha um botão Curtir. Toda vez que alguém clica, o número de curtidas daquele recado aumenta em 1, e o número aparece no cartão: ❤️ 3.

Não precisa saber quem curtiu, só quantas curtidas cada recado tem.

Pense antes de programar

  • Onde o número de curtidas fica guardado? Que tipo de informação ele é: texto ou número?
  • Um recado que acabou de ser postado tem quantas curtidas?
  • O que acontece, passo a passo, quando alguém clica em Curtir?

Você vai praticar

  • Acrescentar uma coluna a uma tabela que já existe, com uma migration nova.
  • Fazer contas com números inteiros.
  • Criar um botão que muda um dado no banco de dados.

No código, os nomes ficam em inglês: a coluna das curtidas se chama likes, e a ação de curtir, like.

Tente resolver sem ajuda antes de abrir as dicas. Abra uma de cada vez, só se precisar.

Dica 1: a coluna nova

Gere uma migration que acrescenta uma coluna de número inteiro (integer) à tabela messages (os recados):

bin/rails generate migration AddLikesToMessages likes:integer

Antes de rodar, abra a migration e faça a coluna começar em zero, mudando a linha do add_column para:

add_column :messages, :likes, :integer, default: 0, null: false

Depois, rode bin/rails db:migrate, como no capítulo Como guardar os recados?.

Dica 2: somar 1

No console, teste antes de mexer nas telas:

message = Message.first
message.likes

O console mostra quantas curtidas o recado tem. Agora some 1:

message.increment!(:likes)

O increment! soma 1 e já guarda no banco de dados. Veja o número de novo:

message.likes

Rode o increment! mais uma vez e veja o número mudar.

Dica 3: a rota e o controller

O clique no botão precisa de uma rota nova para o recado. Em config/routes.rb, acrescente um do ... end à linha do resources :messages:

resources :messages, only: [ :index, :new, :create, :edit, :update, :destroy ] do
  member do
    post :like
  end
end

E uma ação nova no MessagesController:

def like
  message = Message.find(params[:id])
  message.increment!(:likes)
  redirect_to root_path
end
Dica 4: o botão

No cartão de cada recado, na view, junto com os botões Editar e Apagar, use o button_to:

<%= button_to "❤️ #{message.likes}", like_message_path(message), class: "button is-small" %>

O botão mostra o número de curtidas e, ao ser clicado, chama a ação like (curtir).

Indo além

  • Faça o botão mostrar só ❤️ enquanto o recado não tem curtidas, e ❤️ 1, ❤️ 2… depois disso.
  • Mostre no topo do mural de recados o total de curtidas de todos os recados somados. Dica: Message.sum(:likes).
  • Ordene os recados do mais curtido para o menos curtido.

Material de Rails Girls São Paulo, licenciado sob CC BY-NC-SA 4.0. Uso livre e gratuito com atribuição; uso comercial proibido.

This site uses Just the Docs, a documentation theme for Jekyll.