aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/flash.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/flash.rb')
-rw-r--r--actionpack/lib/action_controller/flash.rb65
1 files changed, 65 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/flash.rb b/actionpack/lib/action_controller/flash.rb
new file mode 100644
index 0000000000..220ed8c77a
--- /dev/null
+++ b/actionpack/lib/action_controller/flash.rb
@@ -0,0 +1,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 \ No newline at end of file