Module: CacheableFlash::CookieFlash

Included in:
CacheableFlash, Middleware
Defined in:
lib/cacheable_flash/cookie_flash.rb

Instance Method Summary collapse

Instance Method Details



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/cacheable_flash/cookie_flash.rb', line 11

def cookie_flash(flash, cookies)
  cflash = (JSON.parse(cookies['flash']) if cookies['flash']) || {} rescue {}

  flash.each do |key, value| # key like :notice, or :error, or :sticky
    # When stacking we won't be escaping anything here, because will be array, not string
    value = ERB::Util.html_escape(value) if value.kind_of?(String) && !value.html_safe? # Since v0.3.0 only escaping strings
    skey = key.to_s
    # This allows any data type to be stored in the cookie; important for using an array as the value with
    # stackable_flash
    # The cookie flash will generally be set to a value stacked according to the :stack_with_proc of stackable_flash
    # But when there is already a value for the cookie when we get here, we need to join them somehow.
    stacked_value = value.respond_to?(:stack) ? value.stack : value
    if cflash[skey].kind_of?(Array) # Just because it could be an array
      if stacked_value.kind_of?(Array)
        cflash[skey] += stacked_value
      else
        cflash[skey] << stacked_value
      end
    else
      cflash[skey] = stacked_value
    end
  end
  # I have forgotten why the gsub + matters, so NOTE: to future self: document weird shit.
  cflash.to_json.gsub("+", "%2B")
end