Sha256: 3dfee412b19ba57f321668dea90dfa243f71ecba665fbd9cb539d1666d3dd5a3

Contents?: true

Size: 1.96 KB

Versions: 29

Compression:

Stored size: 1.96 KB

Contents

#          Copyright (c) 2009 Michael Fellinger m.fellinger@gmail.com
# All files in this distribution are subject to the terms of the Ruby license.

module Ramaze
  module Helper

    # provides an call/answer mechanism, this is useful for example in a
    # login-system.
    #
    # It is basically good to redirect temporarly somewhere else without
    # forgetting where you come from and offering a nice way to get back
    # to the last urls.
    #
    # Example:
    #
    # class AuthController < Controller
    #   helper :stack
    #
    #   def login pass
    #     if pass == 'password'
    #       session[:logged_in] = true
    #       answer '/'
    #     else
    #       "failed"
    #     end
    #   end
    #
    #   def logged_in?
    #     !!session[:logged_in]
    #   end
    # end
    #
    # class ImportantController < Controller
    #   helper :stack
    #
    #   def secret_information
    #     call :login unless logged_in?
    #     "Agent X is assigned to fight the RubyNinjas"
    #   end
    # end
    module Stack
      # redirect to another location and pushing the current location
      # on the session[:STACK]
      def push(frame)
        (session[:STACK] ||= []) << frame
      end

      def call(this)
        push(request.fullpath)
        redirect(this)
      end

      # return to the last location on session[:STACK]
      # The optional alternative paramter will be used to redirect in case you
      # are not inside_stack?
      # If the session has no stack and no alternative is given this won't do
      # anything
      def answer(alternative = nil)
        if inside_stack?
          stack = session[:STACK]
          target = stack.pop
          session.delete(:STACK) if stack.empty?
          redirect(target)
        elsif alternative
          redirect(alternative)
        end
      end

      # check if the stack has something inside.
      def inside_stack?
        session[:STACK] and session[:STACK].any?
      end
    end
  end
end

Version data entries

29 entries across 29 versions & 4 rubygems

Version Path
Pistos-ramaze-2009.04.08 lib/ramaze/helper/stack.rb
Pistos-ramaze-2009.06.12 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.04.01 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.04.08 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.04.18 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.04.22 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.04 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.05.08 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.05 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.06.04 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.06.12 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.06 lib/ramaze/helper/stack.rb
manveru-ramaze-2009.07 lib/ramaze/helper/stack.rb
rjspotter-ramaze-2009.06.29 lib/ramaze/helper/stack.rb
rjspotter-ramaze-2009.06.31 lib/ramaze/helper/stack.rb
ramaze-2011.01.30 lib/ramaze/helper/stack.rb
ramaze-2011.01 lib/ramaze/helper/stack.rb
ramaze-2010.06.18 lib/ramaze/helper/stack.rb
ramaze-2010.04.04 lib/ramaze/helper/stack.rb
ramaze-2010.04 lib/ramaze/helper/stack.rb