0.0
No release in over a year
Use html_safe strings naturally in Rails flash messages
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

Runtime

>= 6
 Project Readme

html_safe_flash

Use html_safe strings naturally in Rails flash messages.

Installation

Add this line to your application's Gemfile anywhere after rails:

gem "html_safe_flash"

Usage

Store any html_safe string (or an array of them) in the Rails flash object:

class PostsController < ApplicationController
  def create
    @post.save!
    flash[:success] = "Done! Go view your #{link_to "post", @post}.".html_safe
    redirect_to :index
  end
end

This gem patches ActionDispatch::Flash::FlashHash to track any html_safe values internally. In the example above, this is the actual flash data stored in the session cookie:

{
  "success": "Done! Go view your <a href='/posts/1'>post</a>.",
  "_html_safe_keys": ["success"]
}

On the next request, the _html_safe_keys metadata is removed and the success message is converted back to an ActiveSupport::SafeBuffer automatically.

Without this gem, the code above would not work as one might expect: Calling html_safe on the message returns a ActiveSupport::SafeBuffer object, which becomes a normal string when Rails stores it in the session cookie. When the cookie is loaded on the next page, the html_safe? state of the message would be lost.

Why?

Using html_safe like this was possible in old versions of Rails, which serialized cookies using Marshal, allowing arbitrary objects like ActiveSupport::SafeBuffer to be stored. In Rails 4.1 this was changed for security reasons, and cookie data is limited to the basic types supported by the default JSON serializer.

Without a way to store html_safe values, some applications work around the issue by rendering every flash message with html_safe or raw. This can become a cross-site scripting security vulnerability if a message ever includes unescaped user input.

License

The gem is available as open source under the terms of the MIT License.