Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
c64d749a
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c64d749a
编写于
7月 16, 2008
作者:
S
Stefan Kaes
提交者:
Joshua Peek
7月 16, 2008
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fixed template recompile logic [#630 state:resolved]
Signed-off-by:
N
Joshua Peek
<
josh@joshpeek.com
>
上级
0432d151
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
73 addition
and
22 deletion
+73
-22
actionpack/lib/action_view/renderable.rb
actionpack/lib/action_view/renderable.rb
+31
-22
actionpack/test/abstract_unit.rb
actionpack/test/abstract_unit.rb
+1
-0
actionpack/test/template/compiled_templates_test.rb
actionpack/test/template/compiled_templates_test.rb
+41
-0
未找到文件。
actionpack/lib/action_view/renderable.rb
浏览文件 @
c64d749a
...
...
@@ -9,6 +9,10 @@ def self.included(base)
include
ActiveSupport
::
Memoizable
def
filename
'compiled-template'
end
def
handler
Template
.
handler_class_for_extension
(
extension
)
end
...
...
@@ -35,35 +39,41 @@ def method(local_assigns)
end
private
# Compile and evaluate the template's code
# Compile and evaluate the template's code
(if necessary)
def
compile
(
local_assigns
)
render_symbol
=
method
(
local_assigns
)
@@mutex
.
synchronize
do
return
false
unless
recompile?
(
render_symbol
)
if
recompile?
(
render_symbol
)
compile!
(
render_symbol
,
local_assigns
)
end
end
end
locals_code
=
local_assigns
.
keys
.
map
{
|
key
|
"
#{
key
}
= local_assigns[:
#{
key
}
];"
}.
join
def
compile!
(
render_symbol
,
local_assigns
)
locals_code
=
local_assigns
.
keys
.
map
{
|
key
|
"
#{
key
}
= local_assigns[:
#{
key
}
];"
}.
join
source
=
<<-
end_src
def
#{
render_symbol
}
(local_assigns)
old_output_buffer = output_buffer;
#{
locals_code
}
;
#{
compiled_source
}
ensure
self.output_buffer = old_output_buffer
end
end_src
source
=
<<-
end_src
def
#{
render_symbol
}
(local_assigns)
old_output_buffer = output_buffer;
#{
locals_code
}
;
#{
compiled_source
}
ensure
self.output_buffer = old_output_buffer
end
end_src
begin
file_name
=
respond_to?
(
:filename
)
?
filename
:
'compiled-template'
ActionView
::
Base
::
CompiledTemplates
.
module_eval
(
source
,
file_name
,
0
)
rescue
Exception
=>
e
# errors from template code
if
logger
=
ActionController
::
Base
.
logger
logger
.
debug
"ERROR: compiling
#{
render_symbol
}
RAISED
#{
e
}
"
logger
.
debug
"Function body:
#{
source
}
"
logger
.
debug
"Backtrace:
#{
e
.
backtrace
.
join
(
"
\n
"
)
}
"
end
begin
logger
=
ActionController
::
Base
.
logger
logger
.
debug
"Compiling template
#{
render_symbol
}
"
if
logger
raise
ActionView
::
TemplateError
.
new
(
self
,
{},
e
)
ActionView
::
Base
::
CompiledTemplates
.
module_eval
(
source
,
filename
,
0
)
rescue
Exception
=>
e
# errors from template code
if
logger
logger
.
debug
"ERROR: compiling
#{
render_symbol
}
RAISED
#{
e
}
"
logger
.
debug
"Function body:
#{
source
}
"
logger
.
debug
"Backtrace:
#{
e
.
backtrace
.
join
(
"
\n
"
)
}
"
end
raise
ActionView
::
TemplateError
.
new
(
self
,
{},
e
)
end
end
...
...
@@ -71,8 +81,7 @@ def #{render_symbol}(local_assigns)
# The template will be compiled if the file has not been compiled yet, or
# if local_assigns has a new key, which isn't supported by the compiled code yet.
def
recompile?
(
symbol
)
meth
=
Base
::
CompiledTemplates
.
instance_method
(
template
.
method
)
rescue
nil
!
(
meth
&&
frozen?
)
!
(
frozen?
&&
Base
::
CompiledTemplates
.
method_defined?
(
symbol
))
end
end
end
actionpack/test/abstract_unit.rb
浏览文件 @
c64d749a
...
...
@@ -23,6 +23,7 @@
ActionController
::
Routing
::
Routes
.
reload
rescue
nil
FIXTURE_LOAD_PATH
=
File
.
join
(
File
.
dirname
(
__FILE__
),
'fixtures'
)
ActionView
::
PathSet
::
Path
.
eager_load_templates!
ActionController
::
Base
.
view_paths
=
FIXTURE_LOAD_PATH
# Wrap tests that use Mocha and skip if unavailable.
...
...
actionpack/test/template/compiled_templates_test.rb
0 → 100644
浏览文件 @
c64d749a
require
'abstract_unit'
require
'controller/fake_models'
uses_mocha
'TestTemplateRecompilation'
do
class
CompiledTemplatesTest
<
Test
::
Unit
::
TestCase
def
setup
@view
=
ActionView
::
Base
.
new
(
ActionController
::
Base
.
view_paths
,
{})
@compiled_templates
=
ActionView
::
Base
::
CompiledTemplates
@compiled_templates
.
instance_methods
.
each
do
|
m
|
@compiled_templates
.
send
(
:remove_method
,
m
)
if
m
=~
/^_run_/
end
end
def
test_template_gets_compiled
assert_equal
0
,
@compiled_templates
.
instance_methods
.
size
assert_equal
"Hello world!"
,
@view
.
render
(
"test/hello_world.erb"
)
assert_equal
1
,
@compiled_templates
.
instance_methods
.
size
end
def
test_template_gets_recompiled_when_using_different_keys_in_local_assigns
assert_equal
0
,
@compiled_templates
.
instance_methods
.
size
assert_equal
"Hello world!"
,
@view
.
render
(
"test/hello_world.erb"
)
assert_equal
"Hello world!"
,
@view
.
render
(
"test/hello_world.erb"
,
{
:foo
=>
"bar"
})
assert_equal
2
,
@compiled_templates
.
instance_methods
.
size
end
def
test_compiled_template_will_not_be_recompiled_when_rendered_with_identical_local_assigns
assert_equal
0
,
@compiled_templates
.
instance_methods
.
size
assert_equal
"Hello world!"
,
@view
.
render
(
"test/hello_world.erb"
)
ActionView
::
Template
.
any_instance
.
expects
(
:compile!
).
never
assert_equal
"Hello world!"
,
@view
.
render
(
"test/hello_world.erb"
)
end
def
test_compiled_template_will_always_be_recompiled_when_rendered_if_template_is_outside_cache
assert_equal
0
,
@compiled_templates
.
instance_methods
.
size
assert_equal
"Hello world!"
,
@view
.
render
(
"
#{
FIXTURE_LOAD_PATH
}
/test/hello_world.erb"
)
ActionView
::
Template
.
any_instance
.
expects
(
:compile!
).
times
(
3
)
3
.
times
{
assert_equal
"Hello world!"
,
@view
.
render
(
"
#{
FIXTURE_LOAD_PATH
}
/test/hello_world.erb"
)
}
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录