/
railtie.rb
162 lines (134 loc) · 6.08 KB
/
railtie.rb
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# frozen_string_literal: true
require "rails"
require "action_controller"
require "action_dispatch/railtie"
require "abstract_controller/railties/routes_helpers"
require "action_controller/railties/helpers"
require "action_view/railtie"
module ActionController
class Railtie < Rails::Railtie # :nodoc:
config.action_controller = ActiveSupport::OrderedOptions.new
config.action_controller.raise_on_open_redirects = false
config.action_controller.log_query_tags_around_actions = true
config.action_controller.wrap_parameters_by_default = false
config.action_controller.assertions = :rails_dom_testing
config.eager_load_namespaces << AbstractController
config.eager_load_namespaces << ActionController
initializer "action_controller.deprecator", before: :load_environment_config do |app|
app.deprecators[:action_controller] = ActionController.deprecator
end
initializer "action_controller.assets_config", group: :all do |app|
app.config.action_controller.assets_dir ||= app.config.paths["public"].first
end
initializer "action_controller.set_helpers_path" do |app|
ActionController::Helpers.helpers_path = app.helpers_paths
end
initializer "action_controller.parameters_config" do |app|
options = app.config.action_controller
ActiveSupport.on_load(:action_controller, run_once: true) do
ActionController::Parameters.permit_all_parameters = options.permit_all_parameters || false
if app.config.action_controller[:always_permitted_parameters]
ActionController::Parameters.always_permitted_parameters =
app.config.action_controller.always_permitted_parameters
end
action_on_unpermitted_parameters = options.action_on_unpermitted_parameters
if action_on_unpermitted_parameters.nil?
action_on_unpermitted_parameters = Rails.env.local? ? :log : false
end
ActionController::Parameters.action_on_unpermitted_parameters = action_on_unpermitted_parameters
unless options.allow_deprecated_parameters_hash_equality.nil?
ActionController::Parameters.allow_deprecated_parameters_hash_equality =
options.allow_deprecated_parameters_hash_equality
end
end
end
initializer "action_controller.set_configs" do |app|
paths = app.config.paths
options = app.config.action_controller
options.logger ||= Rails.logger
options.cache_store ||= Rails.cache
options.javascripts_dir ||= paths["public/javascripts"].first
options.stylesheets_dir ||= paths["public/stylesheets"].first
# Ensure readers methods get compiled.
options.asset_host ||= app.config.asset_host
options.relative_url_root ||= app.config.relative_url_root
ActiveSupport.on_load(:action_controller) do
include app.routes.mounted_helpers
extend ::AbstractController::Railties::RoutesHelpers.with(app.routes)
extend ::ActionController::Railties::Helpers
wrap_parameters format: [:json] if options.wrap_parameters_by_default && respond_to?(:wrap_parameters)
# Configs used in other initializers
filtered_options = options.except(
:default_protect_from_forgery,
:log_query_tags_around_actions,
:permit_all_parameters,
:action_on_unpermitted_parameters,
:always_permitted_parameters,
:wrap_parameters_by_default,
:allow_deprecated_parameters_hash_equality,
:assertions
)
filtered_options.each do |k, v|
k = "#{k}="
if respond_to?(k)
send(k, v)
elsif !Base.respond_to?(k)
raise "Invalid option key: #{k}"
end
end
end
end
initializer "action_controller.compile_config_methods" do
ActiveSupport.on_load(:action_controller) do
config.compile_methods! if config.respond_to?(:compile_methods!)
end
end
initializer "action_controller.request_forgery_protection" do |app|
ActiveSupport.on_load(:action_controller_base) do
if app.config.action_controller.default_protect_from_forgery
protect_from_forgery with: :exception
end
end
end
initializer "action_controller.query_log_tags" do |app|
query_logs_tags_enabled = app.config.respond_to?(:active_record) &&
app.config.active_record.query_log_tags_enabled &&
app.config.action_controller.log_query_tags_around_actions
if query_logs_tags_enabled
app.config.active_record.query_log_tags |= [:controller] unless app.config.active_record.query_log_tags.include?(:namespaced_controller)
app.config.active_record.query_log_tags |= [:action]
ActiveSupport.on_load(:active_record) do
ActiveRecord::QueryLogs.taggings.merge!(
controller: ->(context) { context[:controller]&.controller_name },
action: ->(context) { context[:controller]&.action_name },
namespaced_controller: ->(context) {
if context[:controller]
controller_class = context[:controller].class
# based on ActionController::Metal#controller_name, but does not demodulize
unless controller_class.anonymous?
controller_class.name.delete_suffix("Controller").underscore
end
end
}
)
end
end
end
initializer "action_controller.test_case" do |app|
assertions = app.config.action_controller.delete(:assertions)
ActiveSupport.on_load(:action_controller_test_case) do
ActionController::TestCase.executor_around_each_request = app.config.active_support.executor_around_test_case
case assertions
when :capybara
include ActionView::CapybaraAssertions
when :rails_dom_testing
include ActionView::RailsDomTestingAssertions
when :none
# do nothing
else
raise ArgumentError.new("unrecognized value #{assertions.inspect} for config.action_controller.assertions")
end
end
end
end
end