Rails Flash Message com Boostrap

ApplicationHelper

Rails tem como um dos principios o Dont Repeat Yourself que consistem em reutilizar funcionalidades, claro que quando faz sentido, podemos concentrar alguns helpers que usamos nas nossa views para evitar aquele copy paste.

Flash Messages com Boostrap

Normalmente uso Boostrap 4 nos meus projetos, o boostrap tem vários compenentes já com um layout definido para usarmos. Um deles é o alerta para informar-mos quando algo foi salvo, foi excluído, quando erramos a senha entre outras coisas.

No rails podemos mandar um alert dentro do nosso controller, esse alert será exibido como padrão na proxíma view redirecionada.

# app/controllers/people_controller.rb
def create
  @person = Person.new(person_params)

  if @person.save
    redirect_to @person, notice: 'Criado com sucesso'
  end
end

app/views/people/show.html.erb
<p id="notice"><%= notice %></p>

que vai renderizar

Criado com sucesso

Podemos criar um Helper no application helper já identifica o tipo de alerta do Boostrap com o flash message do Rails

module ApplicationHelper
  BOOTSTRAP_ALERTS = { notice: :success, alert: :warning, error: :danger }.freeze

  def flash_message
    messages = ''
    BOOTSTRAP_ALERTS.keys.each do |type|
      if flash[type]
        messages += "<div class='alert alert-#{BOOTSTRAP_ALERTS[type]}' role='alert'>#{flash[type]}</div>"
      end
    end

    messages.html_safe
  end
end

Agora podemos substituimos <p id="notice"><%= notice %></p> por:

app/views/people/show.html.erb
<%= flash_message %>

Podemos passar o alert que quisermos

flash[:danger] = 'Alteração não permitida'
flash[:error] = 'O usuário não existe'

Referências

Boostrap 4 alerts
Api - Ruby on Rails
NandoVieira