Sha256: f04c28a684d9cf31202017bcfcfe42ca4728ab581864759162ac4a3b07264c7d

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

require "active_support/concern"
require "active_support/core_ext/array/wrap"
require "active_support/core_ext/module/attribute_accessors_per_thread"
require "active_support/core_ext/object/try"

module HtmlSafeFlash
  module FlashHashExtension
    extend ActiveSupport::Concern

    prepended do
      thread_mattr_accessor :handle_html_safe_flash, instance_writer: false, default: true
    end

    class_methods do
      def from_session_value(*)
        super.tap do |flash|
          flash.send(:deserialize_html_safe_values) if handle_html_safe_flash
        end
      end
    end

    def to_session_value
      serialize_html_safe_values if handle_html_safe_flash
      super
    end

    private

    HTML_SAFE_KEYS = "_html_safe_keys"

    def deserialize_html_safe_values
      Array.wrap(@flashes.delete(HTML_SAFE_KEYS)).each do |key|
        value = @flashes[key]
        if value.respond_to?(:html_safe)
          @flashes[key] = value.html_safe
        end
      end
    end

    def serialize_html_safe_values
      safe_keys = @flashes.except(*@discard).filter_map do |key, value|
        key if value.is_a?(ActiveSupport::SafeBuffer) && value.html_safe?
      end

      if safe_keys.empty?
        @flashes.delete(HTML_SAFE_KEYS)
      else
        @flashes[HTML_SAFE_KEYS] = safe_keys
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
html_safe_flash-0.1.0 lib/html_safe_flash/flash_hash_extension.rb