Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -182,10 +182,15 @@ class << self | |
# that alert()s the caught exception (and then re-raises it). | ||
cattr_accessor :debug_rjs | ||
|
||
# Specify whether to check whether modified templates are recompiled without a restart | ||
# Specify whether templates should be cached. Otherwise the file we be read everytime it is accessed. | ||
# Automaticaly reloading templates are not thread safe and should only be used in development mode. | ||
@@cache_template_loading = false | ||
cattr_accessor :cache_template_loading | ||
|
||
def self.cache_template_loading? | ||
ActionController::Base.allow_concurrency || cache_template_loading | ||
end | ||
|
||
attr_internal :request | ||
|
||
delegate :request_forgery_protection_token, :template, :params, :session, :cookies, :response, :headers, | ||
|
@@ -226,6 +231,8 @@ def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil) | |
|
||
def view_paths=(paths) | ||
@view_paths = self.class.process_view_paths(paths) | ||
# we might be using ReloadableTemplates, so we need to let them know this a new request | ||
@view_paths.load! | ||
end | ||
|
||
# Returns the result of a render that's dictated by the options hash. The primary options are: | ||
|
@@ -247,8 +254,8 @@ def render(options = {}, local_assigns = {}, &block) #:nodoc: | |
if options[:layout] | ||
_render_with_layout(options, local_assigns, &block) | ||
elsif options[:file] | ||
template = self.view_paths.find_template(options[:file], template_format) | ||
template.render_template(self, options[:locals]) | ||
tempalte = self.view_paths.find_template(options[:file], template_format) | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
joshpencheon
Contributor
|
||
tempalte.render_template(self, options[:locals]) | ||
elsif options[:partial] | ||
render_partial(options) | ||
elsif options[:inline] | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
module ActionView #:nodoc: | ||
class ReloadableTemplate < Template | ||
|
||
class TemplateDeleted < ActionView::ActionViewError | ||
end | ||
|
||
class ReloadablePath < Template::Path | ||
|
||
def initialize(path) | ||
super | ||
@paths = {} | ||
new_request! | ||
end | ||
|
||
def new_request! | ||
@disk_cache = {} | ||
end | ||
alias_method :load!, :new_request! | ||
|
||
def [](path) | ||
if found_template = @paths[path] | ||
begin | ||
found_template.reset_cache_if_stale! | ||
rescue TemplateDeleted | ||
unregister_template(found_template) | ||
self[path] | ||
end | ||
else | ||
load_all_templates_from_dir(templates_dir_from_path(path)) | ||
@paths[path] | ||
end | ||
end | ||
|
||
def register_template_from_file(template_file_path) | ||
if !@paths[template_relative_path = template_file_path.split("#{@path}/").last] && File.file?(template_file_path) | ||
register_template(ReloadableTemplate.new(template_relative_path, self)) | ||
end | ||
end | ||
|
||
def register_template(template) | ||
template.accessible_paths.each do |path| | ||
@paths[path] = template | ||
end | ||
end | ||
|
||
# remove (probably deleted) template from cache | ||
def unregister_template(template) | ||
template.accessible_paths.each do |template_path| | ||
@paths.delete(template_path) if @paths[template_path] == template | ||
end | ||
# fill in any newly created gaps | ||
@paths.values.uniq.each do |template| | ||
template.accessible_paths.each {|path| @paths[path] ||= template} | ||
end | ||
end | ||
|
||
# load all templates from the directory of the requested template | ||
def load_all_templates_from_dir(dir) | ||
# hit disk only once per template-dir/request | ||
@disk_cache[dir] ||= template_files_from_dir(dir).each {|template_file| register_template_from_file(template_file)} | ||
end | ||
|
||
def templates_dir_from_path(path) | ||
dirname = File.dirname(path) | ||
File.join(@path, dirname == '.' ? '' : dirname) | ||
end | ||
|
||
# get all the template filenames from the dir | ||
def template_files_from_dir(dir) | ||
Dir.glob(File.join(dir, '*')) | ||
end | ||
|
||
end | ||
|
||
module Unfreezable | ||
def freeze; self; end | ||
end | ||
|
||
def initialize(*args) | ||
super | ||
@compiled_methods = [] | ||
|
||
# we don't ever want to get frozen | ||
extend Unfreezable | ||
end | ||
|
||
def mtime | ||
File.mtime(filename) | ||
end | ||
|
||
attr_accessor :previously_last_modified | ||
|
||
def stale? | ||
previously_last_modified.nil? || previously_last_modified < mtime | ||
rescue Errno::ENOENT => e | ||
undef_my_compiled_methods! | ||
raise TemplateDeleted | ||
end | ||
|
||
def reset_cache_if_stale! | ||
if stale? | ||
flush_cache 'source', 'compiled_source' | ||
undef_my_compiled_methods! | ||
@previously_last_modified = mtime | ||
end | ||
self | ||
end | ||
|
||
def undef_my_compiled_methods! | ||
@compiled_methods.each {|comp_method| ActionView::Base::CompiledTemplates.send(:remove_method, comp_method)} | ||
@compiled_methods.clear | ||
end | ||
|
||
def compile!(render_symbol, local_assigns) | ||
super | ||
@compiled_methods << render_symbol | ||
end | ||
|
||
end | ||
end |
4 comments
on commit 3942cb4
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We just have to hope that it work better than when using rails-dev-boost, because the later doesn’t seem to reload models after a git pull, which cause me a headache followed by the quick removal of this plugin.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a small clarification to avoid more headaches :). Only faster reloading templates have been ported, not the constants trickery. Also my fork of rails-dev-boost is not compatible with Rails edge, but only with Rails 2.3.0-RC1 and Rails 2.2.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don’t hope, try and give feedback :-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It does look like a typo and was previously fixed by pixeltrix in 893e9eb9950 only to be unintentionally reintroduced back by me (I was automaticaly reverting some of the commits). It should be fixed in the next patch.
Is this a spelling mistake?
Should
tempalte
betemplate
?