O framework Rails possui uma forma bem simples e direta de renderizar mensagens personalizadas no navegador: o Flash. Com ele é possível armazenar temporariamente dados que ficam disponíveis para serem utilizados na próxima requisição, o que é bastante útil para apresentar mensagens de erro, de sucesso ou avisos para a pessoa que está navegando na aplicação. Por exemplo: "Dados salvos com sucesso", "CPF não é válido" ou "Você está logado".
Por padrão, você pode utilizar os objetos :notice
, :alert
, ou :flash
, mas não está limitado a apenas eles. Você deve configurá-los no controller e, então, renderizar uma view. Considere, por exemplo, uma aplicação para cadastrar livros (book
). A action create
poderia ficar assim no BooksController
:
def create
@book = Book.new(book_params)
return redirect_to @book if @book.save
flash[:alert] = "Todos campos devem ser preenchidos"
render :new
end
Com o código acima, caso a validação de um novo livro falhe, o formulário de criação é renderizado novamente e é definida uma mensagem de flash[:alert]
com "Todos os campos devem ser preenchidos". Neste caso utilizamos render
, já que queremos manter os mesmos valores que foram preenchidos no formulário e que a mensagem apareça assim que a página for carregada.
A mensagem também aparece se utilizarmos o redirect_to
no lugar de render
caso, por exemplo, a navegação seja redirecionada para o show
com uma mensagem de "Cadastro realizado com sucesso". Se, no entanto, a intenção for renderizar uma mensagem na própria action
, você pode utilizar o flash.now
, por exemplo:
def index
@books = Books.all
flash.now[:notice] = "Não há livros cadastrados" unless @books.any?
end
Agora, para renderizar as mensagens, precisamos chamá-las na view. Normalmente esse código é aplicado no layout da aplicação dessa maneira:
<% flash.each do |nome, mensagem| %>
<%= content_tag :div, mensagem, class: nome %>
<% end %>
Se quiser usar content_tag
, pode definir a classe do elemento HTML e é possível personalizar o visual da mensagem de acordo com o nome, deixando cada tipo com um estilo diferente.
Como foi comentado anteriormente, também é possível adicionar outros tipos de Flash. Para isso, utilizamos o método add_flash_types
no ApplicationController
. Por exemplo:
class ApplicationController < ActionController::Base
add_flash_types :warning
end
Referências
- https://www.rubyguides.com/2019/11/rails-flash-messages/
- https://guides.rubyonrails.org/action_controller_overview.html#the-flash
- https://api.rubyonrails.org/classes/ActionController/Flash/ClassMethods.html