Postar direto do mural de recados 📝
O desafio
Hoje, para postar um recado, a pessoa clica em Novo recado e vai para outra página. Num mural de verdade, você escreve o recado ali mesmo, na frente da parede.
O desafio é colocar o formulário na página principal, em cima dos cartões, para postar sem sair do mural de recados:

Este desafio é para depois do capítulo E se alguém mandar um recado vazio?, porque mexe nos avisos do formulário.
Pense antes de programar
- O formulário precisa de um recado em branco para preencher. Na página Novo recado, quem prepara esse recado é a ação
new. E na página principal? - O botão Novo recado e a página Novo recado ainda fazem sentido? Ficam, ou saem?
- Quando um recado é recusado, onde os avisos devem aparecer: na página Novo recado ou na página principal?
Você vai praticar
- Usar o mesmo formulário em mais de uma página.
- Preparar, na ação
index, o que a view precisa. - Escolher qual view o controller mostra quando o recado é recusado.
Tente resolver sem ajuda antes de abrir as dicas. Abra uma de cada vez, só se precisar.
Dica 1: o recado em branco
O formulário usa o @message, um recado em branco. Na ação index do controller, logo abaixo da linha do @messages, acrescente:
@message = Message.new
Repare na diferença de uma letra, como no capítulo 04: o @message é o recado em branco, e o @messages é a lista.
Dica 2: o formulário na página principal
No app/views/messages/index.html.erb, troque a linha do link Novo recado pelo formulário.
Se você fez o bônus da partial, no passo 9 do capítulo 07, é uma linha só:
<%= render "form", message: @message, submit_text: "Postar recado" %>
Se não fez, copie o formulário do new.html.erb, do <%= form_with até o <% end %> dele. É uma boa hora para experimentar a partial: agora o mesmo formulário aparece em três lugares.
Dica 3: e quando o recado é recusado?
Poste um recado sem nome. A pessoa vai parar na página Novo recado, com o aviso. Funciona, mas tira a pessoa do mural de recados.
Para os avisos aparecerem na página principal, troque, na ação create, a linha do render :new por estas duas:
@messages = Message.order(created_at: :desc)
render :index, status: :unprocessable_entity
O render :index mostra a view do mural de recados, e ela precisa da lista de recados. Por isso o @messages é buscado de novo, como na ação index. Sem essa linha, aparece o erro undefined method 'empty?' for nil.
Indo além
- Tire o que não é mais usado: a página Novo recado (o
new.html.erb), a açãonewe o:newda lista doonly, noconfig/routes.rb. O app continua funcionando? O que você precisou conferir antes de apagar? - Deixe o formulário menor, numa coluna ao lado dos cartões. Dica: procure por
columnsna documentação do Bulma.