Automatic Rails Flash messages with Localization support
Michael Coyne
Posted on November 18, 2023
Every Rails developer knows about the flash
feature and how it's often used to present alerts and notices after a user performs an action. These flashes can be set directly in a controller's action like so:
def create
@post = Post.new(post_params)
if @post.save
redirect_to post_urls, flash: { notice: 'Post created successfully' }
else
render :new, status: :unprocessable_entity
end
end
Having user-facing text in our controllers is a bit obtrusive though as it distracts from the action's business logic.
To minimize this while also maintaining robust user messaging, I often include the below concern in my controllers. This module will set up easy auto-assignment of flash messages from localizations!
# app/controllers/concerns/flashable.rb
module Flashable
extend ActiveSupport::Concern
included do
after_action :try_to_set_flash
end
def try_to_set_flash
return unless request.post? || request.patch? || request.delete?
catch :exception do
case response.status
when 200..399
flash[:notice] = I18n.t('success', scope: flash_i18n_namespace, throw: true)
when 400..499
flash[:alert] = I18n.t('error', scope: flash_i18n_namespace, throw: true)
end
end
end
def flash_i18n_namespace
"flash.#{controller_name}.#{action_name}"
end
end
Once you've created this module in your code base, you can include Flashable
in your ApplicationController
. Next, create a new locale file under config/locales/flashes.en.yml
.
The module expects flashes localization entries to be named using the controller and action. When the action was successful a "success" entry set to flash[:notice]
. When the action failed, the "error" messages is set to flash[:alert].
en:
flash:
posts:
create:
success: Post was successfully created
error: Post was failed to save
sessions:
create:
success: Login successful.
destroy:
success: Logout successful.
š Happy coding!
Posted on November 18, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.