merb 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +66 -31
- data/Rakefile +3 -1
- data/bin/merb +47 -13
- data/examples/app_skeleton/Rakefile +4 -3
- data/examples/app_skeleton/dist/app/helpers/global_helper.rb +6 -0
- data/examples/app_skeleton/dist/conf/merb.yml +11 -0
- data/examples/app_skeleton/dist/conf/mup.conf +5 -0
- data/examples/app_skeleton/dist/conf/router.rb +1 -3
- data/examples/app_skeleton/scripts/merb_stop +10 -2
- data/examples/sample_app/Rakefile +3 -3
- data/examples/sample_app/dist/app/controllers/files.rb +3 -3
- data/examples/sample_app/dist/app/controllers/posts.rb +25 -23
- data/examples/sample_app/dist/app/controllers/test.rb +7 -3
- data/examples/sample_app/dist/app/helpers/global_helper.rb +7 -0
- data/examples/sample_app/dist/app/helpers/posts_helper.rb +4 -0
- data/examples/sample_app/dist/app/views/layout/application.herb +5 -4
- data/examples/sample_app/dist/app/views/layout/foo.herb +1 -1
- data/examples/sample_app/dist/app/views/posts/new.herb +9 -2
- data/examples/sample_app/dist/app/views/shared/_test.herb +1 -0
- data/examples/sample_app/dist/conf/merb.yml +7 -7
- data/examples/sample_app/dist/conf/merb_init.rb +8 -1
- data/examples/sample_app/dist/conf/mup.conf +5 -11
- data/examples/sample_app/dist/conf/router.rb +1 -1
- data/examples/sample_app/dist/public/test.html +5 -0
- data/examples/sample_app/dist/schema/migrations/002_add_sessions_table.rb +1 -1
- data/examples/sample_app/dist/schema/schema.rb +1 -1
- data/examples/sample_app/log/merb.4000.pid +1 -0
- data/lib/merb.rb +35 -17
- data/lib/merb/core_ext.rb +2 -0
- data/lib/merb/{merb_class_extensions.rb → core_ext/merb_class.rb} +42 -0
- data/lib/merb/core_ext/merb_enumerable.rb +7 -0
- data/lib/merb/{merb_utils.rb → core_ext/merb_hash.rb} +1 -78
- data/lib/merb/core_ext/merb_kernel.rb +16 -0
- data/lib/merb/core_ext/merb_module.rb +10 -0
- data/lib/merb/core_ext/merb_numeric.rb +20 -0
- data/lib/merb/core_ext/merb_object.rb +6 -0
- data/lib/merb/core_ext/merb_string.rb +40 -0
- data/lib/merb/core_ext/merb_symbol.rb +12 -0
- data/lib/merb/merb_constants.rb +18 -0
- data/lib/merb/merb_controller.rb +150 -76
- data/lib/merb/{session/merb_drb_server.rb → merb_drb_server.rb} +13 -46
- data/lib/merb/merb_exceptions.rb +4 -0
- data/lib/merb/merb_handler.rb +29 -17
- data/lib/merb/merb_request.rb +95 -0
- data/lib/merb/merb_upload_handler.rb +46 -0
- data/lib/merb/merb_upload_progress.rb +48 -0
- data/lib/merb/merb_view_context.rb +46 -0
- data/lib/merb/merb_yaml_store.rb +31 -0
- data/lib/merb/mixins/basic_authentication_mixin.rb +2 -2
- data/lib/merb/mixins/controller_mixin.rb +24 -75
- data/lib/merb/mixins/erubis_capture_mixin.rb +84 -0
- data/lib/merb/mixins/javascript_mixin.rb +103 -19
- data/lib/merb/mixins/merb_status_codes.rb +59 -0
- data/lib/merb/mixins/render_mixin.rb +114 -40
- data/lib/merb/mixins/responder_mixin.rb +2 -1
- data/lib/merb/session/merb_ar_session.rb +120 -0
- data/lib/merb/session/merb_drb_session.rb +0 -6
- data/lib/merb/vendor/paginator/paginator.rb +102 -99
- metadata +44 -8
- data/examples/sample_app/script/startdrb +0 -8
- data/lib/merb/session/merb_session.rb +0 -64
- data/lib/mutex_hotfix.rb +0 -34
@@ -0,0 +1,84 @@
|
|
1
|
+
module Merb
|
2
|
+
|
3
|
+
module ErubisCaptureMixin
|
4
|
+
# Capture allows you to extract a part of the template into an
|
5
|
+
# instance variable. You can use this instance variable anywhere
|
6
|
+
# in your templates and even in your layout.
|
7
|
+
#
|
8
|
+
# Example of capture being used in a .herb page:
|
9
|
+
#
|
10
|
+
# <% @foo = capture do %>
|
11
|
+
# <p>Some Foo content!</p>
|
12
|
+
# <% end %>
|
13
|
+
def capture(*args, &block)
|
14
|
+
# execute the block
|
15
|
+
begin
|
16
|
+
buffer = eval("_buf", block.binding)
|
17
|
+
rescue
|
18
|
+
buffer = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
if buffer.nil?
|
22
|
+
capture_block(*args, &block)
|
23
|
+
else
|
24
|
+
capture_erb_with_buffer(buffer, *args, &block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Calling throw_content stores the block of markup for later use.
|
29
|
+
# Subsequently, you can make calls to it by name with <tt>catch_content</tt>
|
30
|
+
# in another template or in the layout.
|
31
|
+
#
|
32
|
+
# Example:
|
33
|
+
#
|
34
|
+
# <% throw_content :header do %>
|
35
|
+
# alert('hello world')
|
36
|
+
# <% end %>
|
37
|
+
#
|
38
|
+
# You can use catch_content :header anywhere in your templates.
|
39
|
+
#
|
40
|
+
# <%= catch_content :header %>
|
41
|
+
def throw_content(name, content = nil, &block)
|
42
|
+
eval "@_#{name}_content = (@_#{name}_content || '') + capture(&block)"
|
43
|
+
end
|
44
|
+
|
45
|
+
# catch_content catches the thrown content from another template
|
46
|
+
# So when you throw_content(:foo) {...} you can catch_content :foo
|
47
|
+
# in another view or the layout.
|
48
|
+
def catch_content(name)
|
49
|
+
instance_variable_get("@_#{name}_content")
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def capture_block(*args, &block)
|
54
|
+
block.call(*args)
|
55
|
+
end
|
56
|
+
|
57
|
+
def capture_erb(*args, &block)
|
58
|
+
buffer = eval("_buf", block.binding)
|
59
|
+
capture_erb_with_buffer(buffer, *args, &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
def capture_erb_with_buffer(buffer, *args, &block)
|
63
|
+
pos = buffer.length
|
64
|
+
block.call(*args)
|
65
|
+
|
66
|
+
# extract the block
|
67
|
+
data = buffer[pos..-1]
|
68
|
+
|
69
|
+
# replace it in the original with empty string
|
70
|
+
buffer[pos..-1] = ''
|
71
|
+
|
72
|
+
data
|
73
|
+
end
|
74
|
+
|
75
|
+
def erb_content_for(name, &block)
|
76
|
+
eval "@_#{name}_content = (@_#{name}_content|| '') + capture_erb(&block)"
|
77
|
+
end
|
78
|
+
|
79
|
+
def block_content_for(name, &block)
|
80
|
+
eval "@_#{name}_content = (@_#{name}_content|| '') + capture_block(&block)"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -6,10 +6,15 @@ module Merb
|
|
6
6
|
(javascript || '').gsub('\\','\0\0').gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }
|
7
7
|
end
|
8
8
|
|
9
|
+
# creates an <a> tag with with an onclick containing
|
10
|
+
# a js function
|
11
|
+
# link_to_function('click me', "alert('hi!')")
|
9
12
|
def link_to_function(name, function)
|
10
13
|
%{<a href="#" onclick="#{function}; return false;">#{name}</a>}
|
11
14
|
end
|
12
15
|
|
16
|
+
# calls .to_json on data. This will use fjson if installed
|
17
|
+
# so it can be faster than escape_js
|
13
18
|
def js(data)
|
14
19
|
if data.respond_to? :to_json
|
15
20
|
data.to_json
|
@@ -18,43 +23,122 @@ module Merb
|
|
18
23
|
end
|
19
24
|
end
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
scripts
|
24
|
-
|
25
|
-
|
26
|
+
# Requiring javascripts and stylesheets:
|
27
|
+
# you can use require_js(:prototype) or require_css(:shinystyles)
|
28
|
+
# from any view or layout and the scripts will only be included once
|
29
|
+
# in the head of the final page. In the head of your layout you will
|
30
|
+
# need to add these two tags:
|
31
|
+
#
|
32
|
+
# <%= include_required_js %>
|
33
|
+
# <%= include_required_css %>
|
34
|
+
#
|
35
|
+
# --app/views/layouts/application.rhtml
|
36
|
+
#
|
37
|
+
# <html>
|
38
|
+
# <head>
|
39
|
+
# <%= include_required_js %>
|
40
|
+
# <%= include_required_css %>
|
41
|
+
# </head>
|
42
|
+
# <body>
|
43
|
+
# <%= catch_content :layout %>
|
44
|
+
# </body>
|
45
|
+
# </html>
|
46
|
+
#
|
47
|
+
# --app/views/whatever/index.rhtml
|
48
|
+
#
|
49
|
+
# <%= partial(:part1) %>
|
50
|
+
# <%= partial(:part2) %>
|
51
|
+
#
|
52
|
+
# --app/views/whatever/_part1.rhtml
|
53
|
+
#
|
54
|
+
# <% require_js 'this' -%>
|
55
|
+
# <% require_css 'that', 'another_one' -%>
|
56
|
+
#
|
57
|
+
# --app/views/whatever/_part2.rhtml
|
58
|
+
#
|
59
|
+
# <% require_js 'this', 'something_else' -%>
|
60
|
+
# <% require_css 'that' -%>
|
61
|
+
|
62
|
+
|
63
|
+
# require_js(:myjs) can be used to require any javascript
|
64
|
+
# file anywhere in your templates. It will only include the
|
65
|
+
# javascript tag once in the header
|
66
|
+
def require_js(*js)
|
67
|
+
@required_js ||= []
|
68
|
+
@required_js |= js
|
69
|
+
end
|
70
|
+
|
71
|
+
# require_css(:mystyles) can be used to require any javascript
|
72
|
+
# file anywhere in your templates. It will only include the
|
73
|
+
# javascript tag once in the header
|
74
|
+
def require_css(*css)
|
75
|
+
@required_css ||= []
|
76
|
+
@required_css |= css
|
77
|
+
end
|
78
|
+
|
79
|
+
# this goes in the head of your layout if you will be using
|
80
|
+
# require_js
|
81
|
+
def include_required_js
|
82
|
+
js_include_tag(*@required_js)
|
83
|
+
end
|
84
|
+
|
85
|
+
# this goes in the head of your layout if you will be using
|
86
|
+
# require_css
|
87
|
+
def include_required_css
|
88
|
+
css_link_tag(*@required_js)
|
26
89
|
end
|
27
|
-
end
|
28
90
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
91
|
+
# js_include_tag(:foo, :bar, :baz) will create a javascript
|
92
|
+
# include tag for each script in the arguments. It will append
|
93
|
+
# '.js' if it is left out of the call.
|
94
|
+
def js_include_tag(*scripts)
|
95
|
+
return nil if scripts.empty?
|
96
|
+
scripts.inject('') do |memo,script|
|
97
|
+
script = script.to_s
|
98
|
+
memo << %Q|<script src="/javascripts/#{script=~/\.js$/ ? script : script+'.js' }" type="text/javascript">//</script>\n|
|
99
|
+
end
|
34
100
|
end
|
35
|
-
end
|
36
101
|
|
37
|
-
|
38
|
-
|
39
|
-
|
102
|
+
# css_include_tag(:foo, :bar, :baz) will create a stylesheet
|
103
|
+
# link tag for each stylesheet in the arguments. It will append
|
104
|
+
# '.css' if it is left out of the call.
|
105
|
+
def css_include_tag(*scripts)
|
106
|
+
return nil if scripts.empty?
|
107
|
+
scripts.inject('') do |memo,script|
|
108
|
+
script = script.to_s
|
109
|
+
memo << %Q|<link href="/stylesheets/#{script=~/\.css$/ ? script : script+'.css' }" media="all" rel="Stylesheet" type="text/css"/>\n|
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# Prototype library helpers.
|
115
|
+
##
|
40
116
|
|
41
|
-
|
117
|
+
# insert_html takes a position, a dom id and html to be inserted.
|
118
|
+
# insert_html(:before, 'my_dom_id', partial(:foo) )
|
119
|
+
def insert_html(position, id, html)
|
42
120
|
position = options.fetch(:where, :before)
|
43
|
-
"new Insertion.#{position.to_s.camel_case}('#{id}', '#{
|
121
|
+
"new Insertion.#{position.to_s.camel_case}('#{id}', '#{js html}');"
|
44
122
|
end
|
45
123
|
|
46
|
-
|
47
|
-
|
124
|
+
# replace_html takes a dom id and html to replace the contents with
|
125
|
+
# replace_html('my_dom_id', partial(:foo))
|
126
|
+
def replace_html(id, html)
|
127
|
+
"Element.update('#{id}', '#{js html}');"
|
48
128
|
end
|
49
129
|
|
130
|
+
# takes a dom id and hides the corresponding element.
|
50
131
|
def hide(id)
|
51
132
|
"$('#{id}').style.display = 'none';"
|
52
133
|
end
|
53
134
|
|
135
|
+
# takes a dom id and shows the corresponding element.
|
54
136
|
def show(id)
|
55
137
|
"$('#{id}').style.display = 'block';"
|
56
138
|
end
|
57
139
|
|
140
|
+
# takes a dom id and toggles it to either on or off depending
|
141
|
+
# on its current state.
|
58
142
|
def toggle(id)
|
59
143
|
"Element.toggle('#{id}');"
|
60
144
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Merb
|
2
|
+
# thanks to Michael Fellinger
|
3
|
+
STATUS_CODEs = {
|
4
|
+
# 1xx Informational (Request received, continuing process.)
|
5
|
+
:continue => 100,
|
6
|
+
:switching_protocols => 101,
|
7
|
+
|
8
|
+
# 2xx Success (The action was successfully received, understood, and accepted.)
|
9
|
+
:ok => 200,
|
10
|
+
:created => 201,
|
11
|
+
:accepted => 202,
|
12
|
+
:non_authorative_information => 203,
|
13
|
+
:no_content => 204,
|
14
|
+
:resent_content => 205,
|
15
|
+
:partial_content => 206,
|
16
|
+
:multi_status => 207,
|
17
|
+
|
18
|
+
# 3xx Redirection (The client must take additional action to complete the request.)
|
19
|
+
:multiple_choices => 300,
|
20
|
+
:moved_permamently => 301,
|
21
|
+
:moved_temporarily => 302,
|
22
|
+
:found => 302,
|
23
|
+
:see_other => 303,
|
24
|
+
:not_modified => 304,
|
25
|
+
:use_proxy => 305,
|
26
|
+
:switch_proxy => 306,
|
27
|
+
:temporary_redirect => 307,
|
28
|
+
|
29
|
+
# 4xx Client Error (The request contains bad syntax or cannot be fulfilled.)
|
30
|
+
:bad_request => 400,
|
31
|
+
:unauthorized => 401,
|
32
|
+
:payment_required => 402,
|
33
|
+
:forbidden => 403,
|
34
|
+
:not_found => 404,
|
35
|
+
:method_not_allowed => 405,
|
36
|
+
:not_aceptable => 406,
|
37
|
+
:proxy_authentication_required => 407,
|
38
|
+
:request_timeout => 408,
|
39
|
+
:conflict => 409,
|
40
|
+
:gone => 410,
|
41
|
+
:length_required => 411,
|
42
|
+
:precondition_failed => 412,
|
43
|
+
:request_entity_too_large => 413,
|
44
|
+
:request_uri_too_long => 414,
|
45
|
+
:unsupported_media_type => 415,
|
46
|
+
:requested_range_not_satisfiable => 416,
|
47
|
+
:expectation_failed => 417,
|
48
|
+
:retry_with => 449,
|
49
|
+
|
50
|
+
# 5xx Server Error (The server failed to fulfill an apparently valid request.)
|
51
|
+
:internal_server_error => 500,
|
52
|
+
:not_implemented => 501,
|
53
|
+
:bad_gateway => 502,
|
54
|
+
:service_unavailable => 503,
|
55
|
+
:gateway_timeout => 504,
|
56
|
+
:http_version_not_supported => 505,
|
57
|
+
:bandwidth_limit_exceeded => 509, # (not official)
|
58
|
+
}
|
59
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Merb
|
2
2
|
|
3
3
|
module RenderMixin
|
4
|
-
|
4
|
+
|
5
5
|
# shortcut to a template path based on name.
|
6
6
|
def template_dir(loc)
|
7
|
-
File.expand_path(Merb::Server.config[:merb_root]
|
7
|
+
File.expand_path(Merb::Server.config[:merb_root] / "/dist/app/views/#{loc}")
|
8
8
|
end
|
9
9
|
|
10
10
|
# returns the current method name. Used for
|
@@ -14,41 +14,87 @@ module Merb
|
|
14
14
|
caller[depth] =~ /`(.*)'$/; $1
|
15
15
|
end
|
16
16
|
|
17
|
+
# given html, js and xml this method returns the template
|
18
|
+
# extension from the :template_ext map froom your app's
|
19
|
+
# configuration. defaults to .herb, .jerb & .xerb
|
17
20
|
def template_extension_for(ext)
|
18
21
|
Merb::Server.config[:template_ext][ext]
|
19
22
|
end
|
20
23
|
|
21
|
-
#
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
template.result(b)
|
24
|
+
# this returns a ViewContext object populated with all
|
25
|
+
# the instance variables in your controller. This is used
|
26
|
+
# as the view context object for the Erubis templates.
|
27
|
+
def create_view_context
|
28
|
+
ViewContext.new(self)
|
27
29
|
end
|
28
30
|
|
29
|
-
#
|
30
|
-
#
|
31
|
-
|
32
|
-
|
31
|
+
# does a render with no layout. Also sets the
|
32
|
+
# content type header to text/javascript. Use
|
33
|
+
# this when you want to render a template with
|
34
|
+
# .jerb extension.
|
35
|
+
def render_js(template=current_method_name(1))
|
36
|
+
headers['Content-Type'] = "text/javascript"
|
37
|
+
template = new_eruby_obj(template_dir(self.class.name.snake_case) / "/#{template}.#{template_extension_for(:js)}")
|
38
|
+
template.evaluate(create_view_context)
|
33
39
|
end
|
34
40
|
|
35
|
-
# renders nothing but sets the status
|
41
|
+
# renders nothing but sets the status, defaults
|
42
|
+
# to 200
|
36
43
|
def render_nothing(status=200)
|
37
44
|
@status = status
|
38
45
|
return "\n"
|
39
46
|
end
|
40
47
|
|
41
48
|
# renders the action without wrapping it in a layout.
|
42
|
-
|
43
|
-
|
44
|
-
|
49
|
+
# call it without arguments if your template matches
|
50
|
+
# the name of the running action. Otherwise you can
|
51
|
+
# explicitely set the template name excluding the file
|
52
|
+
# extension
|
53
|
+
def render_no_layout(template=current_method_name(1))
|
54
|
+
template = new_eruby_obj(template_dir(self.class.name.snake_case) / "/#{template}.#{template_extension_for(:html)}")
|
55
|
+
template.evaluate(create_view_context)
|
45
56
|
end
|
46
57
|
|
58
|
+
# This is merb's partial render method. You name your
|
59
|
+
# partials _partialname.herb, and then call it like
|
60
|
+
# partial(:partialname). If there is no '/' character
|
61
|
+
# in the argument passed in it will look for the partial
|
62
|
+
# in the view directory that corresponds to the current
|
63
|
+
# controller name. If you pass a string with a path in it
|
64
|
+
# you can render partials in other view directories. So
|
65
|
+
# if you create a views/shared directory then you can call
|
66
|
+
# partials that live there like partial('shared/foo')
|
47
67
|
def partial(template)
|
48
|
-
|
49
|
-
|
68
|
+
if template =~ /\//
|
69
|
+
t = template.split('/')
|
70
|
+
template = t.pop
|
71
|
+
tmpl = new_eruby_obj(template_dir(t.join('/')) / "/_#{template}.#{template_extension_for(:html)}")
|
72
|
+
else
|
73
|
+
tmpl = new_eruby_obj(template_dir(self.class.name.snake_case) / "/_#{template}.#{template_extension_for(:html)}")
|
74
|
+
end
|
75
|
+
tmpl.evaluate(create_view_context)
|
50
76
|
end
|
51
77
|
|
78
|
+
# This creates and returns a new Erubis object populated
|
79
|
+
# with the template from path. If there is no matching
|
80
|
+
# template then we rescue the Errno::ENOENT exception
|
81
|
+
# and raise a no template found message
|
82
|
+
def new_eruby_obj(path)
|
83
|
+
begin
|
84
|
+
Erubis::MEruby.new(IO.read(path))
|
85
|
+
rescue Errno::ENOENT
|
86
|
+
raise "No template found at path: #{path}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# this is the xml builder render method. This method
|
91
|
+
# builds the Builder::XmlMarkup object for you and adds
|
92
|
+
# the xml headers and encoding. Then it evals your template
|
93
|
+
# in the context of the xml object. So your .xerb templates
|
94
|
+
# will look like this:
|
95
|
+
# xml.foo {|xml|
|
96
|
+
# xml.bar "baz"
|
97
|
+
# }
|
52
98
|
def render_xml(template=current_method_name(1))
|
53
99
|
xml = Builder::XmlMarkup.new :indent => 2
|
54
100
|
xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
|
@@ -58,33 +104,61 @@ module Merb
|
|
58
104
|
xml.target!
|
59
105
|
end
|
60
106
|
|
61
|
-
#
|
62
|
-
#
|
63
|
-
# render a template with a different name then then
|
64
|
-
# current action name. Wraps the rendered template in
|
65
|
-
# the layout. Uses layout/application.rhtml unless
|
107
|
+
# This is the main render method that handles layouts.
|
108
|
+
# render will use layout/application.rhtml unless
|
66
109
|
# there is a layout named after the current controller
|
67
|
-
# or
|
68
|
-
|
110
|
+
# or if self.layout= has been set to another value in
|
111
|
+
# the current controller. You can over-ride this setting
|
112
|
+
# by passing an options hash with a :layout => 'layoutname'.
|
113
|
+
# if you with to not render a layout then pass :layout => :none
|
114
|
+
# the first argument to render is the template name. if you do
|
115
|
+
# not pass a template name, it will set the template to
|
116
|
+
# views/controller/action automatically.
|
117
|
+
# examples:
|
118
|
+
# class Test < Merb::Controller
|
119
|
+
# # renders views/test/foo.herb
|
120
|
+
# # in layout application.herb
|
121
|
+
# def foo
|
122
|
+
# # code
|
123
|
+
# render
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# # renders views/test/foo.herb
|
127
|
+
# # in layout application.herb
|
128
|
+
# def bar
|
129
|
+
# # code
|
130
|
+
# render :foo
|
131
|
+
# end
|
132
|
+
#
|
133
|
+
# # renders views/test/baz.herb
|
134
|
+
# # with no layout
|
135
|
+
# def baz
|
136
|
+
# # code
|
137
|
+
# render :layout => :none
|
138
|
+
# end
|
139
|
+
def render(opts={})
|
140
|
+
template = opts[:action] || params[:action]
|
69
141
|
tmpl_ext = template_extension_for(:html)
|
70
|
-
MERB_LOGGER.info("Rendering template: #{
|
142
|
+
MERB_LOGGER.info("Rendering template: #{template}.#{tmpl_ext}")
|
71
143
|
name = self.class.name.snake_case
|
72
|
-
template =
|
73
|
-
|
74
|
-
|
75
|
-
|
144
|
+
template = new_eruby_obj(template_dir(name) / "/#{template}.#{tmpl_ext}")
|
145
|
+
view_context = create_view_context
|
146
|
+
layout_content = template.evaluate(view_context)
|
147
|
+
self.layout = opts[:layout].to_sym if opts.has_key?(:layout)
|
148
|
+
return layout_content if (layout == :none)
|
149
|
+
if layout != :application
|
150
|
+
layout_choice = layout
|
151
|
+
else
|
76
152
|
if File.exist?(template_dir("layout/#{name}.#{tmpl_ext}"))
|
77
|
-
|
153
|
+
layout_choice = name
|
78
154
|
else
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
layout_tmpl = Erubis::Eruby.new( IO.read( "#{template_dir('layout')}/#{layout}.#{tmpl_ext}" ) )
|
87
|
-
layout_tmpl.result(b)
|
155
|
+
layout_choice = layout
|
156
|
+
end
|
157
|
+
end
|
158
|
+
MERB_LOGGER.info("With Layout: #{layout_choice}.#{tmpl_ext}")
|
159
|
+
view_context.instance_eval { throw_content(:layout) { layout_content } }
|
160
|
+
layout_tmpl = new_eruby_obj("#{template_dir('layout')}/#{layout_choice}.#{tmpl_ext}")
|
161
|
+
layout_tmpl.evaluate(view_context)
|
88
162
|
end
|
89
163
|
|
90
164
|
end
|