summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/sample.ru7
-rw-r--r--lib/zorglub/node.rb28
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