actionpack 3.2.22.5 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (265) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +641 -418
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller.rb +1 -8
  6. data/lib/abstract_controller/asset_paths.rb +2 -2
  7. data/lib/abstract_controller/base.rb +39 -37
  8. data/lib/abstract_controller/callbacks.rb +101 -82
  9. data/lib/abstract_controller/collector.rb +7 -3
  10. data/lib/abstract_controller/helpers.rb +23 -11
  11. data/lib/abstract_controller/layouts.rb +68 -73
  12. data/lib/abstract_controller/logger.rb +1 -2
  13. data/lib/abstract_controller/rendering.rb +22 -13
  14. data/lib/abstract_controller/translation.rb +16 -1
  15. data/lib/abstract_controller/url_for.rb +6 -6
  16. data/lib/abstract_controller/view_paths.rb +1 -1
  17. data/lib/action_controller.rb +15 -6
  18. data/lib/action_controller/base.rb +46 -22
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/caching/fragments.rb +23 -53
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  23. data/lib/action_controller/log_subscriber.rb +11 -8
  24. data/lib/action_controller/metal.rb +16 -30
  25. data/lib/action_controller/metal/conditional_get.rb +76 -32
  26. data/lib/action_controller/metal/data_streaming.rb +20 -26
  27. data/lib/action_controller/metal/exceptions.rb +19 -6
  28. data/lib/action_controller/metal/flash.rb +24 -9
  29. data/lib/action_controller/metal/force_ssl.rb +32 -9
  30. data/lib/action_controller/metal/head.rb +25 -4
  31. data/lib/action_controller/metal/helpers.rb +6 -9
  32. data/lib/action_controller/metal/hide_actions.rb +1 -2
  33. data/lib/action_controller/metal/http_authentication.rb +105 -87
  34. data/lib/action_controller/metal/implicit_render.rb +1 -1
  35. data/lib/action_controller/metal/instrumentation.rb +2 -1
  36. data/lib/action_controller/metal/live.rb +141 -0
  37. data/lib/action_controller/metal/mime_responds.rb +161 -47
  38. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  39. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  40. data/lib/action_controller/metal/redirecting.rb +15 -20
  41. data/lib/action_controller/metal/renderers.rb +11 -9
  42. data/lib/action_controller/metal/rendering.rb +8 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  44. data/lib/action_controller/metal/responder.rb +20 -19
  45. data/lib/action_controller/metal/streaming.rb +12 -18
  46. data/lib/action_controller/metal/strong_parameters.rb +516 -0
  47. data/lib/action_controller/metal/testing.rb +13 -18
  48. data/lib/action_controller/metal/url_for.rb +27 -25
  49. data/lib/action_controller/model_naming.rb +12 -0
  50. data/lib/action_controller/railtie.rb +33 -17
  51. data/lib/action_controller/railties/helpers.rb +22 -0
  52. data/lib/action_controller/record_identifier.rb +18 -72
  53. data/lib/action_controller/test_case.rb +215 -123
  54. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  55. data/lib/action_dispatch.rb +27 -19
  56. data/lib/action_dispatch/http/cache.rb +63 -11
  57. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  58. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  59. data/lib/action_dispatch/http/headers.rb +27 -19
  60. data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
  61. data/lib/action_dispatch/http/mime_type.rb +145 -113
  62. data/lib/action_dispatch/http/mime_types.rb +1 -1
  63. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  64. data/lib/action_dispatch/http/parameters.rb +12 -5
  65. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  66. data/lib/action_dispatch/http/request.rb +49 -18
  67. data/lib/action_dispatch/http/response.rb +129 -35
  68. data/lib/action_dispatch/http/upload.rb +60 -17
  69. data/lib/action_dispatch/http/url.rb +53 -31
  70. data/lib/action_dispatch/journey.rb +5 -0
  71. data/lib/action_dispatch/journey/backwards.rb +5 -0
  72. data/lib/action_dispatch/journey/formatter.rb +146 -0
  73. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  74. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  75. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  76. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  77. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  78. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  79. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  80. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  81. data/lib/action_dispatch/journey/parser.rb +206 -0
  82. data/lib/action_dispatch/journey/parser.y +47 -0
  83. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  84. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  85. data/lib/action_dispatch/journey/route.rb +116 -0
  86. data/lib/action_dispatch/journey/router.rb +164 -0
  87. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  88. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  89. data/lib/action_dispatch/journey/routes.rb +75 -0
  90. data/lib/action_dispatch/journey/scanner.rb +61 -0
  91. data/lib/action_dispatch/journey/visitors.rb +189 -0
  92. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  93. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  94. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  95. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  96. data/lib/action_dispatch/middleware/cookies.rb +168 -57
  97. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  98. data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
  99. data/lib/action_dispatch/middleware/flash.rb +58 -58
  100. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  101. data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
  102. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  103. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  104. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  105. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  106. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  107. data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
  108. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  109. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  110. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  111. data/lib/action_dispatch/middleware/stack.rb +6 -1
  112. data/lib/action_dispatch/middleware/static.rb +5 -24
  113. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  114. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  115. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
  116. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  117. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
  118. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  119. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  122. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  124. data/lib/action_dispatch/railtie.rb +16 -6
  125. data/lib/action_dispatch/request/session.rb +181 -0
  126. data/lib/action_dispatch/routing.rb +41 -40
  127. data/lib/action_dispatch/routing/inspector.rb +240 -0
  128. data/lib/action_dispatch/routing/mapper.rb +501 -273
  129. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  130. data/lib/action_dispatch/routing/redirection.rb +46 -29
  131. data/lib/action_dispatch/routing/route_set.rb +203 -164
  132. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  133. data/lib/action_dispatch/routing/url_for.rb +48 -33
  134. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  135. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  136. data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
  137. data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
  138. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  139. data/lib/action_dispatch/testing/integration.rb +41 -22
  140. data/lib/action_dispatch/testing/test_process.rb +9 -6
  141. data/lib/action_dispatch/testing/test_request.rb +7 -3
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_pack/version.rb +4 -4
  144. data/lib/action_view.rb +17 -8
  145. data/lib/action_view/base.rb +15 -34
  146. data/lib/action_view/buffers.rb +1 -1
  147. data/lib/action_view/context.rb +4 -4
  148. data/lib/action_view/dependency_tracker.rb +91 -0
  149. data/lib/action_view/digestor.rb +85 -0
  150. data/lib/action_view/flows.rb +1 -4
  151. data/lib/action_view/helpers.rb +2 -4
  152. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  153. data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
  154. data/lib/action_view/helpers/asset_url_helper.rb +354 -0
  155. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  156. data/lib/action_view/helpers/cache_helper.rb +150 -18
  157. data/lib/action_view/helpers/capture_helper.rb +42 -29
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  159. data/lib/action_view/helpers/date_helper.rb +268 -247
  160. data/lib/action_view/helpers/debug_helper.rb +10 -11
  161. data/lib/action_view/helpers/form_helper.rb +904 -547
  162. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  163. data/lib/action_view/helpers/form_tag_helper.rb +188 -88
  164. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  165. data/lib/action_view/helpers/number_helper.rb +148 -354
  166. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  167. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  168. data/lib/action_view/helpers/rendering_helper.rb +2 -4
  169. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  170. data/lib/action_view/helpers/tag_helper.rb +43 -37
  171. data/lib/action_view/helpers/tags.rb +39 -0
  172. data/lib/action_view/helpers/tags/base.rb +148 -0
  173. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  174. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  175. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  176. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  177. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  178. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  179. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  180. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  181. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  182. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  183. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  184. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  185. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  186. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  187. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  188. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  189. data/lib/action_view/helpers/tags/label.rb +65 -0
  190. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  191. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  192. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  193. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  194. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  195. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  196. data/lib/action_view/helpers/tags/select.rb +41 -0
  197. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  198. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  199. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  200. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  201. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  202. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  203. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  204. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  205. data/lib/action_view/helpers/text_helper.rb +126 -113
  206. data/lib/action_view/helpers/translation_helper.rb +32 -16
  207. data/lib/action_view/helpers/url_helper.rb +200 -271
  208. data/lib/action_view/locale/en.yml +1 -105
  209. data/lib/action_view/log_subscriber.rb +6 -4
  210. data/lib/action_view/lookup_context.rb +15 -39
  211. data/lib/action_view/model_naming.rb +12 -0
  212. data/lib/action_view/path_set.rb +9 -39
  213. data/lib/action_view/railtie.rb +6 -22
  214. data/lib/action_view/record_identifier.rb +84 -0
  215. data/lib/action_view/renderer/abstract_renderer.rb +10 -19
  216. data/lib/action_view/renderer/partial_renderer.rb +144 -81
  217. data/lib/action_view/renderer/renderer.rb +2 -19
  218. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  219. data/lib/action_view/renderer/template_renderer.rb +14 -13
  220. data/lib/action_view/routing_url_for.rb +107 -0
  221. data/lib/action_view/template.rb +22 -21
  222. data/lib/action_view/template/error.rb +22 -12
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/handlers/builder.rb +1 -1
  225. data/lib/action_view/template/handlers/erb.rb +11 -16
  226. data/lib/action_view/template/handlers/raw.rb +11 -0
  227. data/lib/action_view/template/resolver.rb +111 -83
  228. data/lib/action_view/template/text.rb +12 -8
  229. data/lib/action_view/template/types.rb +57 -0
  230. data/lib/action_view/test_case.rb +66 -43
  231. data/lib/action_view/testing/resolvers.rb +3 -2
  232. data/lib/action_view/vendor/html-scanner.rb +20 -0
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  235. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
  236. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
  237. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  238. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  239. metadata +135 -125
  240. data/lib/action_controller/caching/actions.rb +0 -185
  241. data/lib/action_controller/caching/pages.rb +0 -187
  242. data/lib/action_controller/caching/sweeping.rb +0 -97
  243. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  244. data/lib/action_controller/metal/compatibility.rb +0 -65
  245. data/lib/action_controller/metal/session_management.rb +0 -14
  246. data/lib/action_controller/railties/paths.rb +0 -25
  247. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  248. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  249. data/lib/action_dispatch/middleware/head.rb +0 -18
  250. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  251. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  252. data/lib/action_view/asset_paths.rb +0 -142
  253. data/lib/action_view/helpers/asset_paths.rb +0 -7
  254. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  255. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  256. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  257. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  258. data/lib/sprockets/assets.rake +0 -99
  259. data/lib/sprockets/bootstrap.rb +0 -37
  260. data/lib/sprockets/compressors.rb +0 -83
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  263. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  264. data/lib/sprockets/railtie.rb +0 -62
  265. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,5 +1,3 @@
1
- require 'active_support/hash_with_indifferent_access'
2
-
3
1
  module ActionView
4
2
  # This is the main entry point for rendering. It basically delegates
5
3
  # to other objects like TemplateRenderer and PartialRenderer which
@@ -13,11 +11,6 @@ module ActionView
13
11
 
14
12
  # Main render entry point shared by AV and AC.
15
13
  def render(context, options)
16
- if (options.is_a?(HashWithIndifferentAccess) && !options.respond_to?(:permitted?)) ||
17
- (options.respond_to?(:permitted?) && !options.permitted?)
18
- raise ArgumentError, "render parameters are not permitted"
19
- end
20
-
21
14
  if options.key?(:partial)
22
15
  render_partial(context, options)
23
16
  else
@@ -40,22 +33,12 @@ module ActionView
40
33
 
41
34
  # Direct accessor to template rendering.
42
35
  def render_template(context, options) #:nodoc:
43
- _template_renderer.render(context, options)
36
+ TemplateRenderer.new(@lookup_context).render(context, options)
44
37
  end
45
38
 
46
39
  # Direct access to partial rendering.
47
40
  def render_partial(context, options, &block) #:nodoc:
48
- _partial_renderer.render(context, options, block)
49
- end
50
-
51
- private
52
-
53
- def _template_renderer #:nodoc:
54
- @_template_renderer ||= TemplateRenderer.new(@lookup_context)
55
- end
56
-
57
- def _partial_renderer #:nodoc:
58
- @_partial_renderer ||= PartialRenderer.new(@lookup_context)
41
+ PartialRenderer.new(@lookup_context).render(context, options, block)
59
42
  end
60
43
  end
61
44
  end
@@ -1,7 +1,4 @@
1
- # 1.9 ships with Fibers but we need to require the extra
2
- # methods explicitly. We only load those extra methods if
3
- # Fiber is available in the first place.
4
- require 'fiber' if defined?(Fiber)
1
+ require 'fiber'
5
2
 
6
3
  module ActionView
7
4
  # == TODO
@@ -33,7 +30,7 @@ module ActionView
33
30
  # This is the same logging logic as in ShowExceptions middleware.
34
31
  # TODO Once "exceptron" is in, refactor this piece to simply re-use exceptron.
35
32
  def log_error(exception) #:nodoc:
36
- logger = ActionController::Base.logger
33
+ logger = ActionView::Base.logger
37
34
  return unless logger
38
35
 
39
36
  message = "\n#{exception.class} (#{exception.message}):\n"
@@ -1,18 +1,17 @@
1
1
  require 'active_support/core_ext/object/try'
2
- require 'active_support/core_ext/array/wrap'
3
2
 
4
3
  module ActionView
5
4
  class TemplateRenderer < AbstractRenderer #:nodoc:
6
5
  def render(context, options)
7
6
  @view = context
8
7
  @details = extract_details(options)
9
- extract_format(options[:file] || options[:template], @details)
10
8
  template = determine_template(options)
11
9
  context = @lookup_context
12
10
 
11
+ prepend_formats(template.formats)
12
+
13
13
  unless context.rendered_format
14
- context.formats = template.formats unless template.formats.empty?
15
- context.rendered_format = context.formats.first
14
+ context.rendered_format = template.formats.first || formats.last
16
15
  end
17
16
 
18
17
  render_template(template, options[:layout], options[:locals])
@@ -20,27 +19,29 @@ module ActionView
20
19
 
21
20
  # Determine the template to be rendered using the given options.
22
21
  def determine_template(options) #:nodoc:
23
- keys = options[:locals].try(:keys) || []
22
+ keys = options.fetch(:locals, {}).keys
23
+
24
24
  if options.key?(:text)
25
- Template::Text.new(options[:text], formats.try(:first))
26
- elsif options.key?(:app_template_file)
27
- find_template(options[:app_template_file], nil, false, keys, @details)
25
+ Template::Text.new(options[:text], formats.first)
28
26
  elsif options.key?(:file)
29
- with_fallbacks { find_file(options[:file], nil, false, keys, @details) }
27
+ with_fallbacks { find_template(options[:file], nil, false, keys, @details) }
30
28
  elsif options.key?(:inline)
31
29
  handler = Template.handler_for_extension(options[:type] || "erb")
32
30
  Template.new(options[:inline], "inline template", handler, :locals => keys)
33
31
  elsif options.key?(:template)
34
- options[:template].respond_to?(:render) ?
35
- options[:template] : find_template(options[:template], options[:prefixes], false, keys, @details)
32
+ if options[:template].respond_to?(:render)
33
+ options[:template]
34
+ else
35
+ find_template(options[:template], options[:prefixes], false, keys, @details)
36
+ end
36
37
  else
37
38
  raise ArgumentError, "You invoked render but did not give any of :partial, :template, :inline, :file or :text option."
38
39
  end
39
40
  end
40
41
 
41
- # Renders the given template. An string representing the layout can be
42
+ # Renders the given template. A string representing the layout can be
42
43
  # supplied as well.
43
- def render_template(template, layout_name = nil, locals = {}) #:nodoc:
44
+ def render_template(template, layout_name = nil, locals = nil) #:nodoc:
44
45
  view, locals = @view, locals || {}
45
46
 
46
47
  render_with_layout(layout_name, locals) do |layout|
@@ -0,0 +1,107 @@
1
+ module ActionView
2
+ module RoutingUrlFor
3
+
4
+ # Returns the URL for the set of +options+ provided. This takes the
5
+ # same options as +url_for+ in Action Controller (see the
6
+ # documentation for <tt>ActionController::Base#url_for</tt>). Note that by default
7
+ # <tt>:only_path</tt> is <tt>true</tt> so you'll get the relative "/controller/action"
8
+ # instead of the fully qualified URL like "http://example.com/controller/action".
9
+ #
10
+ # ==== Options
11
+ # * <tt>:anchor</tt> - Specifies the anchor name to be appended to the path.
12
+ # * <tt>:only_path</tt> - If true, returns the relative URL (omitting the protocol, host name, and port) (<tt>true</tt> by default unless <tt>:host</tt> is specified).
13
+ # * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2005/". Note that this
14
+ # is currently not recommended since it breaks caching.
15
+ # * <tt>:host</tt> - Overrides the default (current) host if provided.
16
+ # * <tt>:protocol</tt> - Overrides the default (current) protocol if provided.
17
+ # * <tt>:user</tt> - Inline HTTP authentication (only plucked out if <tt>:password</tt> is also present).
18
+ # * <tt>:password</tt> - Inline HTTP authentication (only plucked out if <tt>:user</tt> is also present).
19
+ #
20
+ # ==== Relying on named routes
21
+ #
22
+ # Passing a record (like an Active Record) instead of a hash as the options parameter will
23
+ # trigger the named route for that record. The lookup will happen on the name of the class. So passing a
24
+ # Workshop object will attempt to use the +workshop_path+ route. If you have a nested route, such as
25
+ # +admin_workshop_path+ you'll have to call that explicitly (it's impossible for +url_for+ to guess that route).
26
+ #
27
+ # ==== Implicit Controller Namespacing
28
+ #
29
+ # Controllers passed in using the +:controller+ option will retain their namespace unless it is an absolute one.
30
+ #
31
+ # ==== Examples
32
+ # <%= url_for(action: 'index') %>
33
+ # # => /blog/
34
+ #
35
+ # <%= url_for(action: 'find', controller: 'books') %>
36
+ # # => /books/find
37
+ #
38
+ # <%= url_for(action: 'login', controller: 'members', only_path: false, protocol: 'https') %>
39
+ # # => https://www.example.com/members/login/
40
+ #
41
+ # <%= url_for(action: 'play', anchor: 'player') %>
42
+ # # => /messages/play/#player
43
+ #
44
+ # <%= url_for(action: 'jump', anchor: 'tax&ship') %>
45
+ # # => /testing/jump/#tax&ship
46
+ #
47
+ # <%= url_for(Workshop.new) %>
48
+ # # relies on Workshop answering a persisted? call (and in this case returning false)
49
+ # # => /workshops
50
+ #
51
+ # <%= url_for(@workshop) %>
52
+ # # calls @workshop.to_param which by default returns the id
53
+ # # => /workshops/5
54
+ #
55
+ # # to_param can be re-defined in a model to provide different URL names:
56
+ # # => /workshops/1-workshop-name
57
+ #
58
+ # <%= url_for("http://www.example.com") %>
59
+ # # => http://www.example.com
60
+ #
61
+ # <%= url_for(:back) %>
62
+ # # if request.env["HTTP_REFERER"] is set to "http://www.example.com"
63
+ # # => http://www.example.com
64
+ #
65
+ # <%= url_for(:back) %>
66
+ # # if request.env["HTTP_REFERER"] is not set or is blank
67
+ # # => javascript:history.back()
68
+ #
69
+ # <%= url_for(action: 'index', controller: 'users') %>
70
+ # # Assuming an "admin" namespace
71
+ # # => /admin/users
72
+ #
73
+ # <%= url_for(action: 'index', controller: '/users') %>
74
+ # # Specify absolute path with beginning slash
75
+ # # => /users
76
+ def url_for(options = nil)
77
+ case options
78
+ when String
79
+ options
80
+ when nil, Hash
81
+ options ||= {}
82
+ options = { :only_path => options[:host].nil? }.merge!(options.symbolize_keys)
83
+ super
84
+ when :back
85
+ _back_url
86
+ else
87
+ polymorphic_path(options)
88
+ end
89
+ end
90
+
91
+ def url_options #:nodoc:
92
+ return super unless controller.respond_to?(:url_options)
93
+ controller.url_options
94
+ end
95
+
96
+ def _routes_context #:nodoc:
97
+ controller
98
+ end
99
+ protected :_routes_context
100
+
101
+ def optimize_routes_generation? #:nodoc:
102
+ controller.respond_to?(:optimize_routes_generation?, true) ?
103
+ controller.optimize_routes_generation? : super
104
+ end
105
+ protected :optimize_routes_generation?
106
+ end
107
+ end
@@ -1,5 +1,3 @@
1
- require 'active_support/core_ext/array/wrap'
2
- require 'active_support/core_ext/object/blank'
3
1
  require 'active_support/core_ext/object/try'
4
2
  require 'active_support/core_ext/kernel/singleton_class'
5
3
  require 'thread'
@@ -82,8 +80,7 @@ module ActionView
82
80
  # problems with converting the user's data to
83
81
  # the <tt>default_internal</tt>.
84
82
  #
85
- # To do so, simply raise the raise +WrongEncodingError+
86
- # as follows:
83
+ # To do so, simply raise +WrongEncodingError+ as follows:
87
84
  #
88
85
  # raise WrongEncodingError.new(
89
86
  # problematic_string,
@@ -94,6 +91,7 @@ module ActionView
94
91
  autoload :Error
95
92
  autoload :Handlers
96
93
  autoload :Text
94
+ autoload :Types
97
95
  end
98
96
 
99
97
  extend Template::Handlers
@@ -123,7 +121,7 @@ module ActionView
123
121
  @locals = details[:locals] || []
124
122
  @virtual_path = details[:virtual_path]
125
123
  @updated_at = details[:updated_at] || Time.now
126
- @formats = Array.wrap(format).map { |f| f.is_a?(Mime::Type) ? f.ref : f }
124
+ @formats = Array(format).map { |f| f.respond_to?(:ref) ? f.ref : f }
127
125
  @compile_mutex = Mutex.new
128
126
  end
129
127
 
@@ -149,9 +147,15 @@ module ActionView
149
147
  end
150
148
 
151
149
  def mime_type
150
+ message = 'Template#mime_type is deprecated and will be removed in Rails 4.1. Please use type method instead.'
151
+ ActiveSupport::Deprecation.warn message
152
152
  @mime_type ||= Mime::Type.lookup_by_extension(@formats.first.to_s) if @formats.first
153
153
  end
154
154
 
155
+ def type
156
+ @type ||= Types[@formats.first] if @formats.first
157
+ end
158
+
155
159
  # Receives a view object and return a template similar to self by using @virtual_path.
156
160
  #
157
161
  # This method is useful if you have a template object but it does not contain its source
@@ -186,7 +190,7 @@ module ActionView
186
190
  # before passing the source on to the template engine, leaving a
187
191
  # blank line in its stead.
188
192
  def encode!
189
- return unless source.encoding_aware? && source.encoding == Encoding::BINARY
193
+ return unless source.encoding == Encoding::BINARY
190
194
 
191
195
  # Look for # encoding: *. If we find one, we'll encode the
192
196
  # String in that encoding, otherwise, we'll use the
@@ -277,20 +281,18 @@ module ActionView
277
281
  end
278
282
  end_src
279
283
 
280
- if source.encoding_aware?
281
- # Make sure the source is in the encoding of the returned code
282
- source.force_encoding(code.encoding)
284
+ # Make sure the source is in the encoding of the returned code
285
+ source.force_encoding(code.encoding)
283
286
 
284
- # In case we get back a String from a handler that is not in
285
- # BINARY or the default_internal, encode it to the default_internal
286
- source.encode!
287
+ # In case we get back a String from a handler that is not in
288
+ # BINARY or the default_internal, encode it to the default_internal
289
+ source.encode!
287
290
 
288
- # Now, validate that the source we got back from the template
289
- # handler is valid in the default_internal. This is for handlers
290
- # that handle encoding but screw up
291
- unless source.valid_encoding?
292
- raise WrongEncodingError.new(@source, Encoding.default_internal)
293
- end
291
+ # Now, validate that the source we got back from the template
292
+ # handler is valid in the default_internal. This is for handlers
293
+ # that handle encoding but screw up
294
+ unless source.valid_encoding?
295
+ raise WrongEncodingError.new(@source, Encoding.default_internal)
294
296
  end
295
297
 
296
298
  begin
@@ -303,7 +305,7 @@ module ActionView
303
305
  logger.debug "Backtrace: #{e.backtrace.join("\n")}"
304
306
  end
305
307
 
306
- raise ActionView::Template::Error.new(self, {}, e)
308
+ raise ActionView::Template::Error.new(self, e)
307
309
  end
308
310
  end
309
311
 
@@ -312,13 +314,12 @@ module ActionView
312
314
  e.sub_template_of(self)
313
315
  raise e
314
316
  else
315
- assigns = view.respond_to?(:assigns) ? view.assigns : {}
316
317
  template = self
317
318
  unless template.source
318
319
  template = refresh(view)
319
320
  template.encode!
320
321
  end
321
- raise Template::Error.new(template, assigns, e)
322
+ raise Template::Error.new(template, e)
322
323
  end
323
324
  end
324
325
 
@@ -1,4 +1,3 @@
1
- require "active_support/core_ext/array/wrap"
2
1
  require "active_support/core_ext/enumerable"
3
2
 
4
3
  module ActionView
@@ -9,13 +8,16 @@ module ActionView
9
8
  class EncodingError < StandardError #:nodoc:
10
9
  end
11
10
 
11
+ class MissingRequestError < StandardError #:nodoc:
12
+ end
13
+
12
14
  class WrongEncodingError < EncodingError #:nodoc:
13
15
  def initialize(string, encoding)
14
16
  @string, @encoding = string, encoding
15
17
  end
16
18
 
17
19
  def message
18
- @string.force_encoding("BINARY")
20
+ @string.force_encoding(Encoding::ASCII_8BIT)
19
21
  "Your template was not saved as valid #{@encoding}. Please " \
20
22
  "either specify #{@encoding} as the encoding for your template " \
21
23
  "in your text editor, or mark the template with its " \
@@ -30,7 +32,7 @@ module ActionView
30
32
 
31
33
  def initialize(paths, path, prefixes, partial, details, *)
32
34
  @path = path
33
- prefixes = Array.wrap(prefixes)
35
+ prefixes = Array(prefixes)
34
36
  template_type = if partial
35
37
  "partial"
36
38
  elsif path =~ /layouts/i
@@ -56,9 +58,9 @@ module ActionView
56
58
 
57
59
  attr_reader :original_exception, :backtrace
58
60
 
59
- def initialize(template, assigns, original_exception)
61
+ def initialize(template, original_exception)
60
62
  super(original_exception.message)
61
- @template, @assigns, @original_exception = template, assigns.dup, original_exception
63
+ @template, @original_exception = template, original_exception
62
64
  @sub_templates = nil
63
65
  @backtrace = original_exception.backtrace
64
66
  end
@@ -76,7 +78,7 @@ module ActionView
76
78
  end
77
79
  end
78
80
 
79
- def source_extract(indentation = 0)
81
+ def source_extract(indentation = 0, output = :console)
80
82
  return unless num = line_number
81
83
  num = num.to_i
82
84
 
@@ -85,14 +87,10 @@ module ActionView
85
87
  start_on_line = [ num - SOURCE_CODE_RADIUS - 1, 0 ].max
86
88
  end_on_line = [ num + SOURCE_CODE_RADIUS - 1, source_code.length].min
87
89
 
88
- indent = ' ' * indentation
89
- line_counter = start_on_line
90
+ indent = end_on_line.to_s.size + indentation
90
91
  return unless source_code = source_code[start_on_line..end_on_line]
91
92
 
92
- source_code.sum do |line|
93
- line_counter += 1
94
- "#{indent}#{line_counter}: #{line}\n"
95
- end
93
+ formatted_code_for(source_code, start_on_line, indent, output)
96
94
  end
97
95
 
98
96
  def sub_template_of(template_path)
@@ -121,6 +119,18 @@ module ActionView
121
119
  'in '
122
120
  end + file_name
123
121
  end
122
+
123
+ def formatted_code_for(source_code, line_counter, indent, output)
124
+ start_value = (output == :html) ? {} : ""
125
+ source_code.inject(start_value) do |result, line|
126
+ line_counter += 1
127
+ if output == :html
128
+ result.update(line_counter.to_s => "%#{indent}s %s\n" % ["", line])
129
+ else
130
+ result << "%#{indent}s: %s\n" % [line_counter, line]
131
+ end
132
+ end
133
+ end
124
134
  end
125
135
  end
126
136
 
@@ -4,10 +4,13 @@ module ActionView #:nodoc:
4
4
  module Handlers #:nodoc:
5
5
  autoload :ERB, 'action_view/template/handlers/erb'
6
6
  autoload :Builder, 'action_view/template/handlers/builder'
7
+ autoload :Raw, 'action_view/template/handlers/raw'
7
8
 
8
9
  def self.extended(base)
9
10
  base.register_default_template_handler :erb, ERB.new
10
11
  base.register_template_handler :builder, Builder.new
12
+ base.register_template_handler :raw, Raw.new
13
+ base.register_template_handler :ruby, :source.to_proc
11
14
  end
12
15
 
13
16
  @@template_handlers = {}
@@ -17,15 +20,15 @@ module ActionView #:nodoc:
17
20
  @@template_extensions ||= @@template_handlers.keys
18
21
  end
19
22
 
20
- # Register a class that knows how to handle template files with the given
21
- # extension. This can be used to implement new template types.
22
- # The constructor for the class must take the ActiveView::Base instance
23
- # as a parameter, and the class must implement a +render+ method that
24
- # takes the contents of the template to render as well as the Hash of
25
- # local assigns available to the template. The +render+ method ought to
26
- # return the rendered template as a string.
27
- def register_template_handler(extension, klass)
28
- @@template_handlers[extension.to_sym] = klass
23
+ # Register an object that knows how to handle template files with the given
24
+ # extensions. This can be used to implement new template types.
25
+ # The handler must respond to `:call`, which will be passed the template
26
+ # and should return the rendered template as a String.
27
+ def register_template_handler(*extensions, handler)
28
+ raise(ArgumentError, "Extension is required") if extensions.empty?
29
+ extensions.each do |extension|
30
+ @@template_handlers[extension.to_sym] = handler
31
+ end
29
32
  @@template_extensions = nil
30
33
  end
31
34