Usando Flash messages em aplicações Rails

Tutoriais - 02/Dez/2020 - por André Kanamura

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
Foto de perfil do autor
André Kanamura

Dev na Campus Code