added capacity for pulling static pages from multiple directory source trees.
[leap_website.git] / app / controllers / application_controller.rb
1
2 class ApplicationController < ActionController::Base
3   protect_from_forgery
4   before_filter :set_locale, :initialize_pages
5
6   class << self
7     attr_accessor :current_site # a class instance variable
8   end
9
10   if Rails.env.production?
11     rescue_from Exception, :with => :render_500
12     rescue_from ActionController::RoutingError, :with => :render_404
13   end
14
15   protected
16
17   ##
18   ## LOCALIZATION
19   ##
20
21   #
22   # ensure that the locale is encoded as the url prefix and I18n.locale is set.
23   #
24   def set_locale
25     if params[:locale].nil?  || !AVAILABLE_LANGUAGES.include?(params[:locale])
26       locale = HttpAcceptLanguage::compatible_language_from(request.headers['HTTP_ACCEPT_LANGUAGE'], AVAILABLE_LANGUAGES) || DEFAULT_LOCALE
27       locale = locale.to_s.sub('-', '_').sub(/_\w\w/, '')
28       if request.path == '/'
29         url = '/' + locale
30       else
31         url = url_for(params.merge(:locale => locale))
32       end
33       redirect_to url
34     else
35       I18n.locale = params[:locale]
36       self.default_url_options[:locale] = params[:locale]
37     end
38   end
39
40   #def default_url_options
41   #  {:locale => locale }
42   #end
43
44   ##
45   ## RENDERING
46   ##
47
48   def render_500
49     render :template => 'errors/error', :status => 500
50   end
51
52   def render_404
53     render :template => 'errors/not_found', :status => 404
54   end
55
56   #
57   # renders the content of a static page
58   #
59   def render_page(page)
60     begin
61       render :template => page.template_path
62     rescue ActionView::MissingTemplate => exc
63       begin
64         render :template => page.template_path(DEFAULT_LOCALE)
65       rescue
66         raise exc
67       end
68     end
69   end
70
71   #
72   # same as render page, but returns the string
73   #
74   def page_body(page)
75     begin
76       render_to_string :template => page.template_path
77     rescue ActionView::MissingTemplate => exc
78       begin
79         render_to_string :template => page.template_path(DEFAULT_LOCALE)
80       rescue
81         raise exc
82       end
83     end
84   end
85   helper_method :page_body
86
87   ##
88   ## SITE
89   ##
90
91   #
92   # if we ever make this code support multiple sites, this should depend on the request's domain
93   #
94   def site
95     self.class.current_site ||= Site.new
96   end
97   helper_method :site
98
99   def initialize_pages
100     if Rails.env.development?
101       site.load_pages
102     else
103       site.reload_pages_if_needed
104     end
105   end
106
107   #def run_once(name, options={})
108   #  key_name = "run_once_#{name}"
109   #  if !Thread.current[key_name] || options[:unless]
110   #    yield
111   #  end
112   #  Thread.current[key_name] = true
113   #end
114
115 end