diff options
| -rw-r--r-- | examples/sample.ru | 7 | ||||
| -rw-r--r-- | lib/zorglub/node.rb | 28 | 
2 files changed, 27 insertions, 8 deletions
diff --git a/examples/sample.ru b/examples/sample.ru index 5692ef5..00d1b7a 100644 --- a/examples/sample.ru +++ b/examples/sample.ru @@ -42,6 +42,10 @@ class Node1 < Zorglub::Node          "<b>should never be seeen</b>"      end      # +    def jump *args +        redirect r(:index,1,2,3) +    end +    #  end  #  APP = Zorglub::App.new do @@ -106,7 +110,7 @@ class Node0 < Zorglub::Node      #      def index          html = "<html><body><ul>" -        html << "<li><a href=\"#{Node1.r('index','a',2,'c')}\">Node1</a> engine, layout, view tests</li>" +        html << "<li><a href=\"#{Node1.r('index','a',2,'c')}\">Node1</a> engine, layout, view, redirect tests</li>"          html << "<li><a href=\"#{Node2.r}\">Node2</a> css helper tests</li>"          html << "<li><a href=\"#{Node3.r}\">Node3</a> session test</li>"          html << "</ul></body></html>" @@ -119,6 +123,7 @@ Node1::LINKS= [              [Node1.r('index','arg1','arg2','arg3'),'index'],              [Node1.r('meth0'),'meth0'],              [Node1.r('meth1','one','two'),'meth1 with args'], +            [Node1.r('jump','one','two'),'test redirect'],              [Node0.r,'back'],  ]  # diff --git a/lib/zorglub/node.rb b/lib/zorglub/node.rb index 357b97f..a161cb6 100644 --- a/lib/zorglub/node.rb +++ b/lib/zorglub/node.rb @@ -55,13 +55,27 @@ module Zorglub          end          #          def realize -            @content = self.send @action[:method], *@action[:args] -            e, v, l = Config.engine_proc(@action[:engine]), view, layout -            # TODO compile and cache -            @content = e.call v, self if e and File.exists? v -            @content = e.call l, self if e and File.exists? l -            response.write @content -            response.finish +            catch(:stop_realize) { +                @content = self.send @action[:method], *@action[:args] +                e, v, l = Config.engine_proc(@action[:engine]), view, layout +                # TODO compile and cache +                @content = e.call v, self if e and File.exists? v +                @content = e.call l, self if e and File.exists? l +                response.write @content +                response.finish +                response +            } +        end +        # +        def redirect target, options={}, &block +            status = options[:status] || 302 +            body   = options[:body] || redirect_body(target) +            header = response.header.merge('Location' => target.to_s) +            throw :stop_realize, Rack::Response.new(body, status, header, &block) +        end +        # +        def redirect_body target +            "You are being redirected, please follow this link to: <a href='#{target}'>#{target}</a>!"          end          #          def engine engine=nil  | 
