+ rescue ActionView::Template::Error => ex
+ ex = ex.original_exception
+
+ if ex.is_a?(ActiveRecord::StatementInvalid) and ex.message =~ /^Timeout::Error/
+ ex = Timeout::Error.new
+ end
+
+ if ex.is_a?(Timeout::Error)
+ render :action => "timeout"
+ else
+ raise
+ end
+ rescue Timeout::Error
+ render :action => "timeout"
+ end
+
+ ##
+ # extend caches_action to include the parameters, locale and logged in
+ # status in all cache keys
+ def self.caches_action(*actions)
+ options = actions.extract_options!
+ cache_path = options[:cache_path] || Hash.new
+
+ options[:unless] = case options[:unless]
+ when NilClass then Array.new
+ when Array then options[:unless]
+ else unlessp = [ options[:unless] ]
+ end
+
+ options[:unless].push(Proc.new do |controller|
+ controller.params.include?(:page)
+ end)
+
+ options[:cache_path] = Proc.new do |controller|
+ cache_path.merge(controller.params).merge(:locale => I18n.locale)
+ end
+
+ actions.push(options)
+
+ super *actions
+ end
+
+ ##
+ # extend expire_action to expire all variants
+ def expire_action(options = {})
+ I18n.available_locales.each do |locale|
+ super options.merge(:locale => locale)
+ end
+ end
+
+ ##
+ # is the requestor logged in?
+ def logged_in?
+ !@user.nil?