aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/rails.rb
blob: d4faca2681901d3e8b3dd652498290b989c79277 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
require "action_controller"

module ActionController
  class Plugin < Rails::Plugin
    plugin_name :action_controller

    initializer "action_controller.set_configs" do |app|
      app.config.action_controller.each do |k,v|
        ActionController::Base.send "#{k}=", v
      end
    end

    # TODO: ActionController::Base.logger should delegate to its own config.logger
    initializer "action_controller.logger" do
      ActionController::Base.logger ||= Rails.logger
    end

    # Routing must be initialized after plugins to allow the former to extend the routes
    initializer "action_controller.initialize_routing" do |app|
      app.route_configuration_files << app.config.routes_configuration_file
      app.route_configuration_files << app.config.builtin_routes_configuration_file
      app.reload_routes!
    end

    # Include middleware to serve up static assets
    initializer "action_controller.initialize_static_server" do |app|
      if app.config.serve_static_assets
        app.config.middleware.use(ActionDispatch::Static, Rails.public_path)
      end
    end

    initializer "action_controller.initialize_middleware_stack" do |app|
      middleware = app.config.middleware
      middleware.use(::Rack::Lock, :if => lambda { ActionController::Base.allow_concurrency })
      middleware.use(::Rack::Runtime)
      middleware.use(ActionDispatch::ShowExceptions, lambda { ActionController::Base.consider_all_requests_local })
      middleware.use(ActionDispatch::Callbacks, lambda { ActionController::Dispatcher.prepare_each_request })
      middleware.use(lambda { ActionController::Base.session_store }, lambda { ActionController::Base.session_options })
      middleware.use(ActionDispatch::ParamsParser)
      middleware.use(::Rack::MethodOverride)
      middleware.use(::Rack::Head)
      middleware.use(ActionDispatch::StringCoercion)
    end

    initializer "action_controller.initialize_framework_caches" do
      ActionController::Base.cache_store ||= RAILS_CACHE
    end

    # Sets +ActionController::Base#view_paths+ and +ActionMailer::Base#template_root+
    # (but only for those frameworks that are to be loaded). If the framework's
    # paths have already been set, it is not changed, otherwise it is
    # set to use Configuration#view_path.
    initializer "action_controller.initialize_framework_views" do |app|
      # TODO: this should be combined with the logic for default config.action_controller.view_paths
      view_path = ActionView::PathSet.type_cast(app.config.view_path, app.config.cache_classes)
      ActionController::Base.view_paths = view_path if ActionController::Base.view_paths.blank?
    end

    initializer "action_controller.initialize_metal" do |app|
      Rails::Rack::Metal.requested_metals = app.config.metals

      app.config.middleware.insert_before(:"ActionDispatch::ParamsParser",
        Rails::Rack::Metal, :if => Rails::Rack::Metal.metals.any?)
    end

    # # Prepare dispatcher callbacks and run 'prepare' callbacks
    initializer "action_controller.prepare_dispatcher" do |app|
      # TODO: This used to say unless defined?(Dispatcher). Find out why and fix.
      require 'rails/dispatcher'

      Dispatcher.define_dispatcher_callbacks(app.config.cache_classes)

      unless app.config.cache_classes
        # Setup dev mode route reloading
        routes_last_modified = app.routes_changed_at
        reload_routes = lambda do
          unless app.routes_changed_at == routes_last_modified
            routes_last_modified = app.routes_changed_at
            app.reload_routes!
          end
        end
        ActionDispatch::Callbacks.before_dispatch { |callbacks| reload_routes.call }
      end
    end

    initializer "action_controller.notifications" do |app|
      require 'active_support/notifications'

      ActiveSupport::Notifications.subscribe do |*args|
        ActionController::Base.log_event(*args) if ActionController::Base.logger
      end
    end

  end
end