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.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +850 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +39 -37
  7. data/lib/abstract_controller/callbacks.rb +101 -82
  8. data/lib/abstract_controller/collector.rb +7 -3
  9. data/lib/abstract_controller/helpers.rb +25 -13
  10. data/lib/abstract_controller/layouts.rb +74 -74
  11. data/lib/abstract_controller/logger.rb +1 -2
  12. data/lib/abstract_controller/rendering.rb +30 -13
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +6 -6
  15. data/lib/abstract_controller/view_paths.rb +1 -1
  16. data/lib/abstract_controller.rb +1 -8
  17. data/lib/action_controller/base.rb +46 -22
  18. data/lib/action_controller/caching/fragments.rb +23 -53
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/log_subscriber.rb +16 -8
  23. data/lib/action_controller/metal/conditional_get.rb +76 -32
  24. data/lib/action_controller/metal/data_streaming.rb +20 -26
  25. data/lib/action_controller/metal/exceptions.rb +19 -6
  26. data/lib/action_controller/metal/flash.rb +24 -9
  27. data/lib/action_controller/metal/force_ssl.rb +70 -12
  28. data/lib/action_controller/metal/head.rb +25 -4
  29. data/lib/action_controller/metal/helpers.rb +5 -9
  30. data/lib/action_controller/metal/hide_actions.rb +0 -1
  31. data/lib/action_controller/metal/http_authentication.rb +107 -83
  32. data/lib/action_controller/metal/implicit_render.rb +1 -1
  33. data/lib/action_controller/metal/instrumentation.rb +2 -1
  34. data/lib/action_controller/metal/live.rb +175 -0
  35. data/lib/action_controller/metal/mime_responds.rb +161 -47
  36. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  37. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  38. data/lib/action_controller/metal/redirecting.rb +15 -20
  39. data/lib/action_controller/metal/renderers.rb +11 -9
  40. data/lib/action_controller/metal/rendering.rb +9 -1
  41. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  42. data/lib/action_controller/metal/responder.rb +20 -19
  43. data/lib/action_controller/metal/streaming.rb +12 -18
  44. data/lib/action_controller/metal/strong_parameters.rb +520 -0
  45. data/lib/action_controller/metal/testing.rb +13 -18
  46. data/lib/action_controller/metal/url_for.rb +28 -25
  47. data/lib/action_controller/metal.rb +17 -32
  48. data/lib/action_controller/model_naming.rb +12 -0
  49. data/lib/action_controller/railtie.rb +33 -17
  50. data/lib/action_controller/railties/helpers.rb +22 -0
  51. data/lib/action_controller/record_identifier.rb +18 -72
  52. data/lib/action_controller/test_case.rb +251 -131
  53. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  54. data/lib/action_controller.rb +15 -6
  55. data/lib/action_dispatch/http/cache.rb +63 -11
  56. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  57. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  58. data/lib/action_dispatch/http/headers.rb +49 -17
  59. data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
  60. data/lib/action_dispatch/http/mime_type.rb +154 -100
  61. data/lib/action_dispatch/http/mime_types.rb +1 -1
  62. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  63. data/lib/action_dispatch/http/parameters.rb +28 -28
  64. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  65. data/lib/action_dispatch/http/request.rb +64 -18
  66. data/lib/action_dispatch/http/response.rb +130 -35
  67. data/lib/action_dispatch/http/upload.rb +63 -20
  68. data/lib/action_dispatch/http/url.rb +98 -35
  69. data/lib/action_dispatch/journey/backwards.rb +5 -0
  70. data/lib/action_dispatch/journey/formatter.rb +146 -0
  71. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  72. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  73. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  74. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  75. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  76. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  77. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  78. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  79. data/lib/action_dispatch/journey/parser.rb +206 -0
  80. data/lib/action_dispatch/journey/parser.y +47 -0
  81. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  82. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  83. data/lib/action_dispatch/journey/route.rb +124 -0
  84. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  85. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  86. data/lib/action_dispatch/journey/router.rb +166 -0
  87. data/lib/action_dispatch/journey/routes.rb +75 -0
  88. data/lib/action_dispatch/journey/scanner.rb +61 -0
  89. data/lib/action_dispatch/journey/visitors.rb +197 -0
  90. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  91. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  92. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  93. data/lib/action_dispatch/journey.rb +5 -0
  94. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  95. data/lib/action_dispatch/middleware/cookies.rb +259 -114
  96. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  97. data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
  98. data/lib/action_dispatch/middleware/flash.rb +58 -58
  99. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  100. data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
  101. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  102. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  103. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  104. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  105. data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
  106. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  107. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  108. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  109. data/lib/action_dispatch/middleware/stack.rb +6 -1
  110. data/lib/action_dispatch/middleware/static.rb +2 -1
  111. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  112. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
  114. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  115. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  118. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  119. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  120. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  121. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  122. data/lib/action_dispatch/railtie.rb +16 -6
  123. data/lib/action_dispatch/request/session.rb +181 -0
  124. data/lib/action_dispatch/routing/inspector.rb +240 -0
  125. data/lib/action_dispatch/routing/mapper.rb +540 -291
  126. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  127. data/lib/action_dispatch/routing/redirection.rb +46 -29
  128. data/lib/action_dispatch/routing/route_set.rb +207 -164
  129. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  130. data/lib/action_dispatch/routing/url_for.rb +48 -33
  131. data/lib/action_dispatch/routing.rb +48 -83
  132. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  133. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  134. data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
  135. data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
  136. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  137. data/lib/action_dispatch/testing/integration.rb +65 -51
  138. data/lib/action_dispatch/testing/test_process.rb +9 -6
  139. data/lib/action_dispatch/testing/test_request.rb +7 -3
  140. data/lib/action_dispatch.rb +21 -15
  141. data/lib/action_pack/version.rb +7 -6
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_view/base.rb +15 -34
  144. data/lib/action_view/buffers.rb +7 -1
  145. data/lib/action_view/context.rb +4 -4
  146. data/lib/action_view/dependency_tracker.rb +93 -0
  147. data/lib/action_view/digestor.rb +85 -0
  148. data/lib/action_view/flows.rb +1 -4
  149. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  150. data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
  151. data/lib/action_view/helpers/asset_url_helper.rb +355 -0
  152. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  153. data/lib/action_view/helpers/cache_helper.rb +150 -18
  154. data/lib/action_view/helpers/capture_helper.rb +44 -31
  155. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  156. data/lib/action_view/helpers/date_helper.rb +269 -248
  157. data/lib/action_view/helpers/debug_helper.rb +10 -11
  158. data/lib/action_view/helpers/form_helper.rb +931 -537
  159. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  160. data/lib/action_view/helpers/form_tag_helper.rb +190 -90
  161. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  162. data/lib/action_view/helpers/number_helper.rb +148 -329
  163. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  164. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  165. data/lib/action_view/helpers/rendering_helper.rb +2 -2
  166. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  167. data/lib/action_view/helpers/tag_helper.rb +46 -33
  168. data/lib/action_view/helpers/tags/base.rb +147 -0
  169. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  170. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  171. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  172. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  173. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  174. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  175. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  176. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  177. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  178. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  179. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  180. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  181. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  182. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  183. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  184. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  185. data/lib/action_view/helpers/tags/label.rb +65 -0
  186. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  187. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  188. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  189. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  190. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  191. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  192. data/lib/action_view/helpers/tags/select.rb +40 -0
  193. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  194. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  195. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  196. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  197. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  198. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  199. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  200. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  201. data/lib/action_view/helpers/tags.rb +39 -0
  202. data/lib/action_view/helpers/text_helper.rb +130 -114
  203. data/lib/action_view/helpers/translation_helper.rb +32 -16
  204. data/lib/action_view/helpers/url_helper.rb +211 -270
  205. data/lib/action_view/helpers.rb +2 -4
  206. data/lib/action_view/locale/en.yml +1 -105
  207. data/lib/action_view/log_subscriber.rb +6 -4
  208. data/lib/action_view/lookup_context.rb +15 -28
  209. data/lib/action_view/model_naming.rb +12 -0
  210. data/lib/action_view/path_set.rb +8 -20
  211. data/lib/action_view/railtie.rb +6 -22
  212. data/lib/action_view/record_identifier.rb +84 -0
  213. data/lib/action_view/renderer/abstract_renderer.rb +25 -19
  214. data/lib/action_view/renderer/partial_renderer.rb +158 -81
  215. data/lib/action_view/renderer/renderer.rb +8 -12
  216. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  217. data/lib/action_view/renderer/template_renderer.rb +12 -10
  218. data/lib/action_view/routing_url_for.rb +107 -0
  219. data/lib/action_view/template/error.rb +22 -12
  220. data/lib/action_view/template/handlers/builder.rb +1 -1
  221. data/lib/action_view/template/handlers/erb.rb +40 -19
  222. data/lib/action_view/template/handlers/raw.rb +11 -0
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/resolver.rb +107 -53
  225. data/lib/action_view/template/text.rb +12 -8
  226. data/lib/action_view/template/types.rb +57 -0
  227. data/lib/action_view/template.rb +25 -23
  228. data/lib/action_view/test_case.rb +67 -42
  229. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  230. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  231. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
  232. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  235. data/lib/action_view/vendor/html-scanner.rb +20 -0
  236. data/lib/action_view.rb +17 -8
  237. metadata +184 -214
  238. data/lib/action_controller/caching/actions.rb +0 -185
  239. data/lib/action_controller/caching/pages.rb +0 -187
  240. data/lib/action_controller/caching/sweeping.rb +0 -97
  241. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  242. data/lib/action_controller/metal/compatibility.rb +0 -65
  243. data/lib/action_controller/metal/session_management.rb +0 -14
  244. data/lib/action_controller/railties/paths.rb +0 -25
  245. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  246. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  247. data/lib/action_dispatch/middleware/head.rb +0 -18
  248. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  249. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  250. data/lib/action_view/asset_paths.rb +0 -142
  251. data/lib/action_view/helpers/asset_paths.rb +0 -7
  252. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  253. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  254. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  255. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  256. data/lib/sprockets/assets.rake +0 -99
  257. data/lib/sprockets/bootstrap.rb +0 -37
  258. data/lib/sprockets/compressors.rb +0 -83
  259. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  260. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/railtie.rb +0 -62
  263. 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 scenrios:
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
- # If no directory is specified for the template name, the template will by default be looked for in <tt>app/views/layouts/</tt>.
140
- # Otherwise, it will be looked up relative to the template root.
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", :except => :rss
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>:except => [ :rss, :text_only ]</tt> is valid, as is <tt>:except => :rss</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 :action => "help", :layout => "help"
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
- remove_possible_method :_layout_conditions
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, :to => "self.class"
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
- # Determines whether the current action has a layout by checking the
216
- # action name against the :only and :except conditions set on the
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 conditional_layout?
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
- @_layout = layout
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
- lookup_context.find_all("#{_implied_layout_name}", #{prefixes.inspect}).first || super
293
+ super
281
294
  RUBY
282
295
  end
283
296
 
284
- if defined?(@_layout)
285
- layout_definition = case @_layout
286
- when String
287
- @_layout.inspect
288
- when Symbol
289
- <<-RUBY
290
- #{@_layout}.tap do |layout|
291
- unless layout.is_a?(String) || !layout
292
- raise ArgumentError, "Your layout method :#{@_layout} returned \#{layout}. It " \
293
- "should have returned a String, false, or nil"
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
- RUBY
329
- end
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 conditional_layout?
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.key?(:layout) ? options.delete(:layout) : :default
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
- def conditional_layout?
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,8 +1,7 @@
1
- require "active_support/core_ext/logger"
2
1
  require "active_support/benchmarkable"
3
2
 
4
3
  module AbstractController
5
- module Logger
4
+ module Logger #:nodoc:
6
5
  extend ActiveSupport::Concern
7
6
 
8
7
  included do
@@ -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 = _routes if respond_to?(:_routes)
54
- helpers = _helpers if respond_to?(:_helpers)
55
- ActionView::Base.prepare(routes, helpers)
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. Just convert the results of
92
- # render_response into a String.
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 to a Rack-compatible body.
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 = %w(
114
- @_action_name @_response_body @_formats @_prefixes @_config
115
- @_view_context_class @_view_renderer @_lookup_context
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 = instance_variable_names
140
+ variables = instance_variables
124
141
  variables -= protected_instance_variables
125
142
  variables -= DEFAULT_PROTECTED_INSTANCE_VARIABLES
126
- variables.each { |name| hash[name.to_s[1, name.length]] = instance_variable_get(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.wrap(paths))
92
+ self._view_paths = ActionView::PathSet.new(Array(paths))
93
93
  end
94
94
  end
95
95
  end
@@ -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/concern'
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 :text => "This server hosted at #{location}"
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 :action => "no_results"
126
- # when 1 then render :action => "show"
127
- # when 2..10 then render :action => "show_many"
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 :action => 'show', :id => @entry.id
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 :action => "elsewhere"
161
- # render :action => "overthere" # raises DoubleRenderError
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(:action => "elsewhere") and return if monkeys.nil?
168
- # render :action => "overthere" # won't be called if monkeys is nil
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
- # Rails 2.x compatibility
231
- include ActionController::Compatibility
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