aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/flash.rb
blob: 220ed8c77a106a20fa751785c10a6e2e6d552c6c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module ActionController #:nodoc:
  # The flash provides a way to pass temporary objects between actions. Anything you place in the flash will be exposed
  # to the very next action and then cleared out. This is a great way of doing notices and alerts, such as a create action
  # that sets <tt>flash["notice"] = "Succesfully created"</tt> before redirecting to a display action that can then expose 
  # the flash to its template. Actually, that exposure is automatically done. Example:
  #
  #   class WeblogController < ActionController::Base
  #     def create
  #       # save post
  #       flash["notice"] = "Succesfully created post"
  #       redirect_to :action => "display", :params => { "id" => post.id }
  #     end
  #
  #     def display
  #       # doesn't need to assign the flash notice to the template, that's done automatically
  #     end
  #   end
  #
  #   display.rhtml
  #     <% if @flash["notice"] %><div class="notice"><%= @flash["notice"] %></div><% end %>
  #
  # This example just places a string in the flash, but you can put any object in there. And of course, you can put as many
  # as you like at a time too. Just remember: They'll be gone by the time the next action has been performed.
  module Flash
    def self.append_features(base) #:nodoc:
      super
      base.before_filter(:fire_flash)
      base.after_filter(:clear_flash)
    end

    protected
      # Access the contents of the flash. Use <tt>flash["notice"]</tt> to read a notice you put there or 
      # <tt>flash["notice"] = "hello"</tt> to put a new one.
      def flash #:doc:
        if @session["flash"].nil?
          @session["flash"]   = {}
          @session["flashes"] ||= 0
        end
        @session["flash"]
      end    

      # Can be called by any action that would like to keep the current content of the flash around for one more action.
      def keep_flash #:doc:
        @session["flashes"] = 0
      end    

    private
      # Records that the contents of @session["flash"] was flashed to the action
      def fire_flash
        if @session["flash"]
          @session["flashes"] += 1 unless @session["flash"].empty?
          @assigns["flash"] = @session["flash"]
        else
          @assigns["flash"] = {}
        end
      end

      def clear_flash
        if @session["flash"] && (@session["flashes"].nil? || @session["flashes"] >= 1)
          @session["flash"]   = {}
          @session["flashes"] = 0 
        end
      end    
  end
end