actionpack 3.2.19 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +850 -401
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +39 -37
- data/lib/abstract_controller/callbacks.rb +101 -82
- data/lib/abstract_controller/collector.rb +7 -3
- data/lib/abstract_controller/helpers.rb +25 -13
- data/lib/abstract_controller/layouts.rb +74 -74
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +30 -13
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +6 -6
- data/lib/abstract_controller/view_paths.rb +1 -1
- data/lib/abstract_controller.rb +1 -8
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/log_subscriber.rb +16 -8
- data/lib/action_controller/metal/conditional_get.rb +76 -32
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +24 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +5 -9
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +107 -83
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +2 -1
- data/lib/action_controller/metal/live.rb +175 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -47
- data/lib/action_controller/metal/params_wrapper.rb +112 -74
- data/lib/action_controller/metal/rack_delegation.rb +9 -3
- data/lib/action_controller/metal/redirecting.rb +15 -20
- data/lib/action_controller/metal/renderers.rb +11 -9
- data/lib/action_controller/metal/rendering.rb +9 -1
- data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
- data/lib/action_controller/metal/responder.rb +20 -19
- data/lib/action_controller/metal/streaming.rb +12 -18
- data/lib/action_controller/metal/strong_parameters.rb +520 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +28 -25
- data/lib/action_controller/metal.rb +17 -32
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +33 -17
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/record_identifier.rb +18 -72
- data/lib/action_controller/test_case.rb +251 -131
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_controller.rb +15 -6
- data/lib/action_dispatch/http/cache.rb +63 -11
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +49 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
- data/lib/action_dispatch/http/mime_type.rb +154 -100
- data/lib/action_dispatch/http/mime_types.rb +1 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +28 -28
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +64 -18
- data/lib/action_dispatch/http/response.rb +130 -35
- data/lib/action_dispatch/http/upload.rb +63 -20
- data/lib/action_dispatch/http/url.rb +98 -35
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +146 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +124 -0
- data/lib/action_dispatch/journey/parser.rb +206 -0
- data/lib/action_dispatch/journey/parser.y +47 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +196 -0
- data/lib/action_dispatch/journey/route.rb +124 -0
- data/lib/action_dispatch/journey/router/strexp.rb +24 -0
- data/lib/action_dispatch/journey/router/utils.rb +54 -0
- data/lib/action_dispatch/journey/router.rb +166 -0
- data/lib/action_dispatch/journey/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +197 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +259 -114
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
- data/lib/action_dispatch/middleware/flash.rb +58 -58
- data/lib/action_dispatch/middleware/params_parser.rb +14 -29
- data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
- data/lib/action_dispatch/middleware/reloader.rb +6 -6
- data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
- data/lib/action_dispatch/middleware/request_id.rb +2 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
- data/lib/action_dispatch/middleware/ssl.rb +70 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +2 -1
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
- data/lib/action_dispatch/railtie.rb +16 -6
- data/lib/action_dispatch/request/session.rb +181 -0
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +540 -291
- data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
- data/lib/action_dispatch/routing/redirection.rb +46 -29
- data/lib/action_dispatch/routing/route_set.rb +207 -164
- data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
- data/lib/action_dispatch/routing/url_for.rb +48 -33
- data/lib/action_dispatch/routing.rb +48 -83
- data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
- data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +65 -51
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_dispatch.rb +21 -15
- data/lib/action_pack/version.rb +7 -6
- data/lib/action_pack.rb +1 -1
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +7 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +93 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
- data/lib/action_view/helpers/asset_url_helper.rb +355 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
- data/lib/action_view/helpers/cache_helper.rb +150 -18
- data/lib/action_view/helpers/capture_helper.rb +44 -31
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +269 -248
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +931 -537
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +190 -90
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -329
- data/lib/action_view/helpers/output_safety_helper.rb +3 -3
- data/lib/action_view/helpers/record_tag_helper.rb +17 -22
- data/lib/action_view/helpers/rendering_helper.rb +2 -2
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +46 -33
- data/lib/action_view/helpers/tags/base.rb +147 -0
- data/lib/action_view/helpers/tags/check_box.rb +64 -0
- data/lib/action_view/helpers/tags/checkable.rb +16 -0
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
- data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
- data/lib/action_view/helpers/tags/collection_select.rb +28 -0
- data/lib/action_view/helpers/tags/color_field.rb +25 -0
- data/lib/action_view/helpers/tags/date_field.rb +13 -0
- data/lib/action_view/helpers/tags/date_select.rb +72 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
- data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
- data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
- data/lib/action_view/helpers/tags/email_field.rb +8 -0
- data/lib/action_view/helpers/tags/file_field.rb +8 -0
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
- data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
- data/lib/action_view/helpers/tags/label.rb +65 -0
- data/lib/action_view/helpers/tags/month_field.rb +13 -0
- data/lib/action_view/helpers/tags/number_field.rb +18 -0
- data/lib/action_view/helpers/tags/password_field.rb +12 -0
- data/lib/action_view/helpers/tags/radio_button.rb +31 -0
- data/lib/action_view/helpers/tags/range_field.rb +8 -0
- data/lib/action_view/helpers/tags/search_field.rb +24 -0
- data/lib/action_view/helpers/tags/select.rb +40 -0
- data/lib/action_view/helpers/tags/tel_field.rb +8 -0
- data/lib/action_view/helpers/tags/text_area.rb +18 -0
- data/lib/action_view/helpers/tags/text_field.rb +29 -0
- data/lib/action_view/helpers/tags/time_field.rb +13 -0
- data/lib/action_view/helpers/tags/time_select.rb +8 -0
- data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
- data/lib/action_view/helpers/tags/url_field.rb +8 -0
- data/lib/action_view/helpers/tags/week_field.rb +13 -0
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/text_helper.rb +130 -114
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +211 -270
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/locale/en.yml +1 -105
- data/lib/action_view/log_subscriber.rb +6 -4
- data/lib/action_view/lookup_context.rb +15 -28
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +8 -20
- data/lib/action_view/railtie.rb +6 -22
- data/lib/action_view/record_identifier.rb +84 -0
- data/lib/action_view/renderer/abstract_renderer.rb +25 -19
- data/lib/action_view/renderer/partial_renderer.rb +158 -81
- data/lib/action_view/renderer/renderer.rb +8 -12
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +12 -10
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +40 -19
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/resolver.rb +107 -53
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/template.rb +25 -23
- data/lib/action_view/test_case.rb +67 -42
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/action_view.rb +17 -8
- metadata +184 -214
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
|
@@ -89,7 +89,7 @@ module AbstractController
|
|
|
89
89
|
# class TillController < BankController
|
|
90
90
|
# layout false
|
|
91
91
|
#
|
|
92
|
-
# In these examples, we have three implicit lookup
|
|
92
|
+
# In these examples, we have three implicit lookup scenarios:
|
|
93
93
|
# * The BankController uses the "bank" layout.
|
|
94
94
|
# * The ExchangeController uses the "exchange" layout.
|
|
95
95
|
# * The CurrencyController inherits the layout from BankController.
|
|
@@ -120,6 +120,7 @@ module AbstractController
|
|
|
120
120
|
# def writers_and_readers
|
|
121
121
|
# logged_in? ? "writer_layout" : "reader_layout"
|
|
122
122
|
# end
|
|
123
|
+
# end
|
|
123
124
|
#
|
|
124
125
|
# Now when a new request for the index action is processed, the layout will vary depending on whether the person accessing
|
|
125
126
|
# is logged in or not.
|
|
@@ -127,7 +128,14 @@ module AbstractController
|
|
|
127
128
|
# If you want to use an inline method, such as a proc, do something like this:
|
|
128
129
|
#
|
|
129
130
|
# class WeblogController < ActionController::Base
|
|
130
|
-
# layout proc{ |controller| controller.logged_in? ? "writer_layout" : "reader_layout" }
|
|
131
|
+
# layout proc { |controller| controller.logged_in? ? "writer_layout" : "reader_layout" }
|
|
132
|
+
# end
|
|
133
|
+
#
|
|
134
|
+
# If an argument isn't given to the proc, it's evaluated in the context of
|
|
135
|
+
# the current controller anyway.
|
|
136
|
+
#
|
|
137
|
+
# class WeblogController < ActionController::Base
|
|
138
|
+
# layout proc { logged_in? ? "writer_layout" : "reader_layout" }
|
|
131
139
|
# end
|
|
132
140
|
#
|
|
133
141
|
# Of course, the most common way of specifying a layout is still just as a plain template name:
|
|
@@ -136,8 +144,8 @@ module AbstractController
|
|
|
136
144
|
# layout "weblog_standard"
|
|
137
145
|
# end
|
|
138
146
|
#
|
|
139
|
-
#
|
|
140
|
-
#
|
|
147
|
+
# The template will be looked always in <tt>app/views/layouts/</tt> folder. But you can point
|
|
148
|
+
# <tt>layouts</tt> folder direct also. <tt>layout "layouts/demo"</tt> is the same as <tt>layout "demo"</tt>.
|
|
141
149
|
#
|
|
142
150
|
# Setting the layout to nil forces it to be looked up in the filesystem and fallbacks to the parent behavior if none exists.
|
|
143
151
|
# Setting it to nil is useful to re-enable template lookup overriding a previous configuration set in the parent:
|
|
@@ -162,7 +170,7 @@ module AbstractController
|
|
|
162
170
|
# <tt>:only</tt> and <tt>:except</tt> options can be passed to the layout call. For example:
|
|
163
171
|
#
|
|
164
172
|
# class WeblogController < ActionController::Base
|
|
165
|
-
# layout "weblog_standard", :
|
|
173
|
+
# layout "weblog_standard", except: :rss
|
|
166
174
|
#
|
|
167
175
|
# # ...
|
|
168
176
|
#
|
|
@@ -172,7 +180,7 @@ module AbstractController
|
|
|
172
180
|
# be rendered directly, without wrapping a layout around the rendered view.
|
|
173
181
|
#
|
|
174
182
|
# Both the <tt>:only</tt> and <tt>:except</tt> condition can accept an arbitrary number of method references, so
|
|
175
|
-
# #<tt
|
|
183
|
+
# #<tt>except: [ :rss, :text_only ]</tt> is valid, as is <tt>except: :rss</tt>.
|
|
176
184
|
#
|
|
177
185
|
# == Using a different layout in the action render call
|
|
178
186
|
#
|
|
@@ -184,7 +192,7 @@ module AbstractController
|
|
|
184
192
|
# layout "weblog_standard"
|
|
185
193
|
#
|
|
186
194
|
# def help
|
|
187
|
-
# render :
|
|
195
|
+
# render action: "help", layout: "help"
|
|
188
196
|
# end
|
|
189
197
|
# end
|
|
190
198
|
#
|
|
@@ -195,30 +203,32 @@ module AbstractController
|
|
|
195
203
|
include Rendering
|
|
196
204
|
|
|
197
205
|
included do
|
|
198
|
-
class_attribute :_layout_conditions
|
|
199
|
-
|
|
206
|
+
class_attribute :_layout, :_layout_conditions, :instance_accessor => false
|
|
207
|
+
self._layout = nil
|
|
200
208
|
self._layout_conditions = {}
|
|
201
209
|
_write_layout_method
|
|
202
210
|
end
|
|
203
211
|
|
|
204
|
-
delegate :_layout_conditions, :
|
|
212
|
+
delegate :_layout_conditions, to: :class
|
|
205
213
|
|
|
206
214
|
module ClassMethods
|
|
207
|
-
def inherited(klass)
|
|
215
|
+
def inherited(klass) # :nodoc:
|
|
208
216
|
super
|
|
209
217
|
klass._write_layout_method
|
|
210
218
|
end
|
|
211
219
|
|
|
212
220
|
# This module is mixed in if layout conditions are provided. This means
|
|
213
221
|
# that if no layout conditions are used, this method is not used
|
|
214
|
-
module LayoutConditions
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
# layout
|
|
222
|
+
module LayoutConditions # :nodoc:
|
|
223
|
+
private
|
|
224
|
+
|
|
225
|
+
# Determines whether the current action has a layout definition by
|
|
226
|
+
# checking the action name against the :only and :except conditions
|
|
227
|
+
# set by the <tt>layout</tt> method.
|
|
218
228
|
#
|
|
219
229
|
# ==== Returns
|
|
220
|
-
# * <tt> Boolean</tt> - True if the action has a layout, false otherwise.
|
|
221
|
-
def
|
|
230
|
+
# * <tt> Boolean</tt> - True if the action has a layout definition, false otherwise.
|
|
231
|
+
def _conditional_layout?
|
|
222
232
|
return unless super
|
|
223
233
|
|
|
224
234
|
conditions = _layout_conditions
|
|
@@ -254,7 +264,7 @@ module AbstractController
|
|
|
254
264
|
conditions.each {|k, v| conditions[k] = Array(v).map {|a| a.to_s} }
|
|
255
265
|
self._layout_conditions = conditions
|
|
256
266
|
|
|
257
|
-
|
|
267
|
+
self._layout = layout
|
|
258
268
|
_write_layout_method
|
|
259
269
|
end
|
|
260
270
|
|
|
@@ -263,7 +273,7 @@ module AbstractController
|
|
|
263
273
|
#
|
|
264
274
|
# ==== Returns
|
|
265
275
|
# * <tt>String</tt> - A template name
|
|
266
|
-
def _implied_layout_name
|
|
276
|
+
def _implied_layout_name # :nodoc:
|
|
267
277
|
controller_path
|
|
268
278
|
end
|
|
269
279
|
|
|
@@ -271,67 +281,51 @@ module AbstractController
|
|
|
271
281
|
#
|
|
272
282
|
# If a layout is not explicitly mentioned then look for a layout with the controller's name.
|
|
273
283
|
# if nothing is found then try same procedure to find super class's layout.
|
|
274
|
-
def _write_layout_method
|
|
284
|
+
def _write_layout_method # :nodoc:
|
|
275
285
|
remove_possible_method(:_layout)
|
|
276
286
|
|
|
277
287
|
prefixes = _implied_layout_name =~ /\blayouts/ ? [] : ["layouts"]
|
|
288
|
+
default_behavior = "lookup_context.find_all('#{_implied_layout_name}', #{prefixes.inspect}).first || super"
|
|
278
289
|
name_clause = if name
|
|
290
|
+
default_behavior
|
|
291
|
+
else
|
|
279
292
|
<<-RUBY
|
|
280
|
-
|
|
293
|
+
super
|
|
281
294
|
RUBY
|
|
282
295
|
end
|
|
283
296
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
#{
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
end
|
|
295
|
-
end
|
|
296
|
-
RUBY
|
|
297
|
-
when Proc
|
|
298
|
-
define_method :_layout_from_proc, &@_layout
|
|
299
|
-
"_layout_from_proc(self)"
|
|
300
|
-
when false
|
|
301
|
-
nil
|
|
302
|
-
when true
|
|
303
|
-
raise ArgumentError, "Layouts must be specified as a String, Symbol, false, or nil"
|
|
304
|
-
when nil
|
|
305
|
-
name_clause
|
|
306
|
-
end
|
|
307
|
-
else
|
|
308
|
-
# Add a deprecation if the parent layout was explicitly set and the child
|
|
309
|
-
# still does a dynamic lookup. In next Rails release, we should @_layout
|
|
310
|
-
# to be inheritable so we can skip the child lookup if the parent explicitly
|
|
311
|
-
# set the layout.
|
|
312
|
-
parent = self.superclass.instance_eval { @_layout if defined?(@_layout) }
|
|
313
|
-
@_layout = nil
|
|
314
|
-
inspect = parent.is_a?(Proc) ? parent.inspect : parent
|
|
315
|
-
|
|
316
|
-
layout_definition = if parent.nil?
|
|
317
|
-
name_clause
|
|
318
|
-
elsif name
|
|
319
|
-
<<-RUBY
|
|
320
|
-
if template = lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first
|
|
321
|
-
ActiveSupport::Deprecation.warn 'Layout found at "#{_implied_layout_name}" for #{name} but parent controller ' \
|
|
322
|
-
'set layout to #{inspect.inspect}. Please explicitly set your layout to "#{_implied_layout_name}" ' \
|
|
323
|
-
'or set it to nil to force a dynamic lookup.'
|
|
324
|
-
template
|
|
325
|
-
else
|
|
326
|
-
super
|
|
297
|
+
layout_definition = case _layout
|
|
298
|
+
when String
|
|
299
|
+
_layout.inspect
|
|
300
|
+
when Symbol
|
|
301
|
+
<<-RUBY
|
|
302
|
+
#{_layout}.tap do |layout|
|
|
303
|
+
return #{default_behavior} if layout.nil?
|
|
304
|
+
unless layout.is_a?(String) || !layout
|
|
305
|
+
raise ArgumentError, "Your layout method :#{_layout} returned \#{layout}. It " \
|
|
306
|
+
"should have returned a String, false, or nil"
|
|
327
307
|
end
|
|
328
|
-
|
|
329
|
-
|
|
308
|
+
end
|
|
309
|
+
RUBY
|
|
310
|
+
when Proc
|
|
311
|
+
define_method :_layout_from_proc, &_layout
|
|
312
|
+
protected :_layout_from_proc
|
|
313
|
+
<<-RUBY
|
|
314
|
+
result = _layout_from_proc(#{_layout.arity == 0 ? '' : 'self'})
|
|
315
|
+
return #{default_behavior} if result.nil?
|
|
316
|
+
result
|
|
317
|
+
RUBY
|
|
318
|
+
when false
|
|
319
|
+
nil
|
|
320
|
+
when true
|
|
321
|
+
raise ArgumentError, "Layouts must be specified as a String, Symbol, Proc, false, or nil"
|
|
322
|
+
when nil
|
|
323
|
+
name_clause
|
|
330
324
|
end
|
|
331
325
|
|
|
332
326
|
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
333
327
|
def _layout
|
|
334
|
-
if
|
|
328
|
+
if _conditional_layout?
|
|
335
329
|
#{layout_definition}
|
|
336
330
|
else
|
|
337
331
|
#{name_clause}
|
|
@@ -342,32 +336,38 @@ module AbstractController
|
|
|
342
336
|
end
|
|
343
337
|
end
|
|
344
338
|
|
|
345
|
-
def _normalize_options(options)
|
|
339
|
+
def _normalize_options(options) # :nodoc:
|
|
346
340
|
super
|
|
347
341
|
|
|
348
342
|
if _include_layout?(options)
|
|
349
|
-
layout = options.
|
|
343
|
+
layout = options.delete(:layout) { :default }
|
|
350
344
|
options[:layout] = _layout_for_option(layout)
|
|
351
345
|
end
|
|
352
346
|
end
|
|
353
347
|
|
|
354
348
|
attr_internal_writer :action_has_layout
|
|
355
349
|
|
|
356
|
-
def initialize(*)
|
|
350
|
+
def initialize(*) # :nodoc:
|
|
357
351
|
@_action_has_layout = true
|
|
358
352
|
super
|
|
359
353
|
end
|
|
360
354
|
|
|
355
|
+
# Controls whether an action should be rendered using a layout.
|
|
356
|
+
# If you want to disable any <tt>layout</tt> settings for the
|
|
357
|
+
# current action so that it is rendered without a layout then
|
|
358
|
+
# either override this method in your controller to return false
|
|
359
|
+
# for that action or set the <tt>action_has_layout</tt> attribute
|
|
360
|
+
# to false before rendering.
|
|
361
361
|
def action_has_layout?
|
|
362
362
|
@_action_has_layout
|
|
363
363
|
end
|
|
364
364
|
|
|
365
|
-
|
|
365
|
+
private
|
|
366
|
+
|
|
367
|
+
def _conditional_layout?
|
|
366
368
|
true
|
|
367
369
|
end
|
|
368
370
|
|
|
369
|
-
private
|
|
370
|
-
|
|
371
371
|
# This will be overwritten by _write_layout_method
|
|
372
372
|
def _layout; end
|
|
373
373
|
|
|
@@ -384,7 +384,7 @@ module AbstractController
|
|
|
384
384
|
when false, nil then nil
|
|
385
385
|
else
|
|
386
386
|
raise ArgumentError,
|
|
387
|
-
"String, true, or false, expected for `layout'; you passed #{name.inspect}"
|
|
387
|
+
"String, Proc, :default, true, or false, expected for `layout'; you passed #{name.inspect}"
|
|
388
388
|
end
|
|
389
389
|
end
|
|
390
390
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
require "abstract_controller/base"
|
|
2
2
|
require "action_view"
|
|
3
|
-
require "active_support/core_ext/object/instance_variables"
|
|
4
3
|
|
|
5
4
|
module AbstractController
|
|
6
5
|
class DoubleRenderError < Error
|
|
@@ -50,9 +49,19 @@ module AbstractController
|
|
|
50
49
|
module ClassMethods
|
|
51
50
|
def view_context_class
|
|
52
51
|
@view_context_class ||= begin
|
|
53
|
-
routes
|
|
54
|
-
helpers =
|
|
55
|
-
|
|
52
|
+
routes = respond_to?(:_routes) && _routes
|
|
53
|
+
helpers = respond_to?(:_helpers) && _helpers
|
|
54
|
+
|
|
55
|
+
Class.new(ActionView::Base) do
|
|
56
|
+
if routes
|
|
57
|
+
include routes.url_helpers
|
|
58
|
+
include routes.mounted_helpers
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
if helpers
|
|
62
|
+
include helpers
|
|
63
|
+
end
|
|
64
|
+
end
|
|
56
65
|
end
|
|
57
66
|
end
|
|
58
67
|
end
|
|
@@ -88,15 +97,23 @@ module AbstractController
|
|
|
88
97
|
self.response_body = render_to_body(options)
|
|
89
98
|
end
|
|
90
99
|
|
|
91
|
-
# Raw rendering of a template to a string.
|
|
92
|
-
#
|
|
100
|
+
# Raw rendering of a template to a string.
|
|
101
|
+
#
|
|
102
|
+
# It is similar to render, except that it does not
|
|
103
|
+
# set the response_body and it should be guaranteed
|
|
104
|
+
# to always return a string.
|
|
105
|
+
#
|
|
106
|
+
# If a component extends the semantics of response_body
|
|
107
|
+
# (as Action Controller extends it to be anything that
|
|
108
|
+
# responds to the method each), this method needs to be
|
|
109
|
+
# overridden in order to still return a string.
|
|
93
110
|
# :api: plugin
|
|
94
111
|
def render_to_string(*args, &block)
|
|
95
112
|
options = _normalize_render(*args, &block)
|
|
96
113
|
render_to_body(options)
|
|
97
114
|
end
|
|
98
115
|
|
|
99
|
-
# Raw rendering of a template
|
|
116
|
+
# Raw rendering of a template.
|
|
100
117
|
# :api: plugin
|
|
101
118
|
def render_to_body(options = {})
|
|
102
119
|
_process_options(options)
|
|
@@ -110,20 +127,20 @@ module AbstractController
|
|
|
110
127
|
view_renderer.render(view_context, options)
|
|
111
128
|
end
|
|
112
129
|
|
|
113
|
-
DEFAULT_PROTECTED_INSTANCE_VARIABLES =
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
130
|
+
DEFAULT_PROTECTED_INSTANCE_VARIABLES = [
|
|
131
|
+
:@_action_name, :@_response_body, :@_formats, :@_prefixes, :@_config,
|
|
132
|
+
:@_view_context_class, :@_view_renderer, :@_lookup_context
|
|
133
|
+
]
|
|
117
134
|
|
|
118
135
|
# This method should return a hash with assigns.
|
|
119
136
|
# You can overwrite this configuration per controller.
|
|
120
137
|
# :api: public
|
|
121
138
|
def view_assigns
|
|
122
139
|
hash = {}
|
|
123
|
-
variables =
|
|
140
|
+
variables = instance_variables
|
|
124
141
|
variables -= protected_instance_variables
|
|
125
142
|
variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
|
|
126
|
-
variables.each { |name| hash[name
|
|
143
|
+
variables.each { |name| hash[name[1..-1]] = instance_variable_get(name) }
|
|
127
144
|
hash
|
|
128
145
|
end
|
|
129
146
|
|
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
module AbstractController
|
|
2
2
|
module Translation
|
|
3
|
+
# Delegates to <tt>I18n.translate</tt>. Also aliased as <tt>t</tt>.
|
|
4
|
+
#
|
|
5
|
+
# When the given key starts with a period, it will be scoped by the current
|
|
6
|
+
# controller and action. So if you call <tt>translate(".foo")</tt> from
|
|
7
|
+
# <tt>PeopleController#index</tt>, it will convert the call to
|
|
8
|
+
# <tt>I18n.translate("people.index.foo")</tt>. This makes it less repetitive
|
|
9
|
+
# to translate many keys within the same controller / action and gives you a
|
|
10
|
+
# simple framework for scoping them consistently.
|
|
3
11
|
def translate(*args)
|
|
12
|
+
key = args.first
|
|
13
|
+
if key.is_a?(String) && (key[0] == '.')
|
|
14
|
+
key = "#{ controller_path.tr('/', '.') }.#{ action_name }#{ key }"
|
|
15
|
+
args[0] = key
|
|
16
|
+
end
|
|
17
|
+
|
|
4
18
|
I18n.translate(*args)
|
|
5
19
|
end
|
|
6
20
|
alias :t :translate
|
|
7
21
|
|
|
22
|
+
# Delegates to <tt>I18n.localize</tt>. Also aliased as <tt>l</tt>.
|
|
8
23
|
def localize(*args)
|
|
9
24
|
I18n.localize(*args)
|
|
10
25
|
end
|
|
11
26
|
alias :l :localize
|
|
12
27
|
end
|
|
13
|
-
end
|
|
28
|
+
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Includes +url_for+ into the host class (e.g. an abstract controller or mailer). The class
|
|
2
|
-
# has to provide a +RouteSet+ by implementing the <tt>_routes</tt> methods. Otherwise, an
|
|
3
|
-
# exception will be raised.
|
|
4
|
-
#
|
|
5
|
-
# Note that this module is completely decoupled from HTTP - the only requirement is a valid
|
|
6
|
-
# <tt>_routes</tt> implementation.
|
|
7
1
|
module AbstractController
|
|
2
|
+
# Includes +url_for+ into the host class (e.g. an abstract controller or mailer). The class
|
|
3
|
+
# has to provide a +RouteSet+ by implementing the <tt>_routes</tt> methods. Otherwise, an
|
|
4
|
+
# exception will be raised.
|
|
5
|
+
#
|
|
6
|
+
# Note that this module is completely decoupled from HTTP - the only requirement is a valid
|
|
7
|
+
# <tt>_routes</tt> implementation.
|
|
8
8
|
module UrlFor
|
|
9
9
|
extend ActiveSupport::Concern
|
|
10
10
|
include ActionDispatch::Routing::UrlFor
|
|
@@ -89,7 +89,7 @@ module AbstractController
|
|
|
89
89
|
# * <tt>paths</tt> - If a PathSet is provided, use that;
|
|
90
90
|
# otherwise, process the parameter into a PathSet.
|
|
91
91
|
def view_paths=(paths)
|
|
92
|
-
self._view_paths = ActionView::PathSet.new(Array
|
|
92
|
+
self._view_paths = ActionView::PathSet.new(Array(paths))
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
end
|
data/lib/abstract_controller.rb
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
activesupport_path = File.expand_path('../../../activesupport/lib', __FILE__)
|
|
2
|
-
$:.unshift(activesupport_path) if File.directory?(activesupport_path) && !$:.include?(activesupport_path)
|
|
3
|
-
|
|
4
1
|
require 'action_pack'
|
|
5
|
-
require 'active_support/
|
|
6
|
-
require 'active_support/ruby/shim'
|
|
7
|
-
require 'active_support/dependencies/autoload'
|
|
8
|
-
require 'active_support/core_ext/class/attribute'
|
|
2
|
+
require 'active_support/rails'
|
|
9
3
|
require 'active_support/core_ext/module/attr_internal'
|
|
10
|
-
require 'active_support/core_ext/module/delegation'
|
|
11
4
|
require 'active_support/core_ext/module/anonymous'
|
|
12
5
|
require 'active_support/i18n'
|
|
13
6
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require "action_controller/log_subscriber"
|
|
2
|
+
require "action_controller/metal/params_wrapper"
|
|
2
3
|
|
|
3
4
|
module ActionController
|
|
4
5
|
# Action Controllers are the core of a web request in \Rails. They are made up of one or more actions that are executed
|
|
@@ -43,7 +44,7 @@ module ActionController
|
|
|
43
44
|
#
|
|
44
45
|
# def server_ip
|
|
45
46
|
# location = request.env["SERVER_ADDR"]
|
|
46
|
-
# render :
|
|
47
|
+
# render text: "This server hosted at #{location}"
|
|
47
48
|
# end
|
|
48
49
|
#
|
|
49
50
|
# == Parameters
|
|
@@ -88,15 +89,6 @@ module ActionController
|
|
|
88
89
|
#
|
|
89
90
|
# Do not put secret information in cookie-based sessions!
|
|
90
91
|
#
|
|
91
|
-
# Other options for session storage:
|
|
92
|
-
#
|
|
93
|
-
# * ActiveRecord::SessionStore - Sessions are stored in your database, which works better than PStore with multiple app servers and,
|
|
94
|
-
# unlike CookieStore, hides your session contents from the user. To use ActiveRecord::SessionStore, set
|
|
95
|
-
#
|
|
96
|
-
# MyApplication::Application.config.session_store :active_record_store
|
|
97
|
-
#
|
|
98
|
-
# in your <tt>config/initializers/session_store.rb</tt> and run <tt>script/rails g session_migration</tt>.
|
|
99
|
-
#
|
|
100
92
|
# == Responses
|
|
101
93
|
#
|
|
102
94
|
# Each action results in a response, which holds the headers and document to be sent to the user's browser. The actual response
|
|
@@ -116,15 +108,15 @@ module ActionController
|
|
|
116
108
|
#
|
|
117
109
|
# Title: <%= @post.title %>
|
|
118
110
|
#
|
|
119
|
-
# You don't have to rely on the automated rendering. For example, actions that could result in the rendering of different templates
|
|
111
|
+
# You don't have to rely on the automated rendering. For example, actions that could result in the rendering of different templates
|
|
120
112
|
# will use the manual rendering methods:
|
|
121
113
|
#
|
|
122
114
|
# def search
|
|
123
115
|
# @results = Search.find(params[:query])
|
|
124
116
|
# case @results.count
|
|
125
|
-
# when 0 then render :
|
|
126
|
-
# when 1 then render :
|
|
127
|
-
# when 2..10 then render :
|
|
117
|
+
# when 0 then render action: "no_results"
|
|
118
|
+
# when 1 then render action: "show"
|
|
119
|
+
# when 2..10 then render action: "show_many"
|
|
128
120
|
# end
|
|
129
121
|
# end
|
|
130
122
|
#
|
|
@@ -133,14 +125,14 @@ module ActionController
|
|
|
133
125
|
# == Redirects
|
|
134
126
|
#
|
|
135
127
|
# Redirects are used to move from one action to another. For example, after a <tt>create</tt> action, which stores a blog entry to the
|
|
136
|
-
# database, we might like to show the user the new entry. Because we're following good DRY principles (Don't Repeat Yourself), we're
|
|
128
|
+
# database, we might like to show the user the new entry. Because we're following good DRY principles (Don't Repeat Yourself), we're
|
|
137
129
|
# going to reuse (and redirect to) a <tt>show</tt> action that we'll assume has already been created. The code might look like this:
|
|
138
130
|
#
|
|
139
131
|
# def create
|
|
140
132
|
# @entry = Entry.new(params[:entry])
|
|
141
133
|
# if @entry.save
|
|
142
134
|
# # The entry was saved correctly, redirect to show
|
|
143
|
-
# redirect_to :
|
|
135
|
+
# redirect_to action: 'show', id: @entry.id
|
|
144
136
|
# else
|
|
145
137
|
# # things didn't go so well, do something else
|
|
146
138
|
# end
|
|
@@ -157,20 +149,48 @@ module ActionController
|
|
|
157
149
|
# An action may contain only a single render or a single redirect. Attempting to try to do either again will result in a DoubleRenderError:
|
|
158
150
|
#
|
|
159
151
|
# def do_something
|
|
160
|
-
# redirect_to :
|
|
161
|
-
# render :
|
|
152
|
+
# redirect_to action: "elsewhere"
|
|
153
|
+
# render action: "overthere" # raises DoubleRenderError
|
|
162
154
|
# end
|
|
163
155
|
#
|
|
164
156
|
# If you need to redirect on the condition of something, then be sure to add "and return" to halt execution.
|
|
165
157
|
#
|
|
166
158
|
# def do_something
|
|
167
|
-
# redirect_to(:
|
|
168
|
-
# render :
|
|
159
|
+
# redirect_to(action: "elsewhere") and return if monkeys.nil?
|
|
160
|
+
# render action: "overthere" # won't be called if monkeys is nil
|
|
169
161
|
# end
|
|
170
162
|
#
|
|
171
163
|
class Base < Metal
|
|
172
164
|
abstract!
|
|
173
165
|
|
|
166
|
+
# We document the request and response methods here because albeit they are
|
|
167
|
+
# implemented in ActionController::Metal, the type of the returned objects
|
|
168
|
+
# is unknown at that level.
|
|
169
|
+
|
|
170
|
+
##
|
|
171
|
+
# :method: request
|
|
172
|
+
#
|
|
173
|
+
# Returns an ActionDispatch::Request instance that represents the
|
|
174
|
+
# current request.
|
|
175
|
+
|
|
176
|
+
##
|
|
177
|
+
# :method: response
|
|
178
|
+
#
|
|
179
|
+
# Returns an ActionDispatch::Response that represents the current
|
|
180
|
+
# response.
|
|
181
|
+
|
|
182
|
+
# Shortcut helper that returns all the modules included in
|
|
183
|
+
# ActionController::Base except the ones passed as arguments:
|
|
184
|
+
#
|
|
185
|
+
# class MetalController
|
|
186
|
+
# ActionController::Base.without_modules(:ParamsWrapper, :Streaming).each do |left|
|
|
187
|
+
# include left
|
|
188
|
+
# end
|
|
189
|
+
# end
|
|
190
|
+
#
|
|
191
|
+
# This gives better control over what you want to exclude and makes it
|
|
192
|
+
# easier to create a bare controller class, instead of listing the modules
|
|
193
|
+
# required manually.
|
|
174
194
|
def self.without_modules(*modules)
|
|
175
195
|
modules = modules.map do |m|
|
|
176
196
|
m.is_a?(Symbol) ? ActionController.const_get(m) : m
|
|
@@ -195,6 +215,7 @@ module ActionController
|
|
|
195
215
|
Caching,
|
|
196
216
|
MimeResponds,
|
|
197
217
|
ImplicitRender,
|
|
218
|
+
StrongParameters,
|
|
198
219
|
|
|
199
220
|
Cookies,
|
|
200
221
|
Flash,
|
|
@@ -227,8 +248,11 @@ module ActionController
|
|
|
227
248
|
include mod
|
|
228
249
|
end
|
|
229
250
|
|
|
230
|
-
#
|
|
231
|
-
|
|
251
|
+
# Define some internal variables that should not be propagated to the view.
|
|
252
|
+
self.protected_instance_variables = [
|
|
253
|
+
:@_status, :@_headers, :@_params, :@_env, :@_response, :@_request,
|
|
254
|
+
:@_view_runtime, :@_stream, :@_url_options, :@_action_has_layout
|
|
255
|
+
]
|
|
232
256
|
|
|
233
257
|
ActiveSupport.run_load_hooks(:action_controller, self)
|
|
234
258
|
end
|