actionpack 3.2.19 → 4.2.11.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,111 +0,0 @@
1
- require 'action_controller/record_identifier'
2
-
3
- module ActionView
4
- # = Action View Record Tag Helpers
5
- module Helpers
6
- module RecordTagHelper
7
- include ActionController::RecordIdentifier
8
-
9
- # Produces a wrapper DIV element with id and class parameters that
10
- # relate to the specified Active Record object. Usage example:
11
- #
12
- # <%= div_for(@person, :class => "foo") do %>
13
- # <%= @person.name %>
14
- # <% end %>
15
- #
16
- # produces:
17
- #
18
- # <div id="person_123" class="person foo"> Joe Bloggs </div>
19
- #
20
- # You can also pass an array of Active Record objects, which will then
21
- # get iterated over and yield each record as an argument for the block.
22
- # For example:
23
- #
24
- # <%= div_for(@people, :class => "foo") do |person| %>
25
- # <%= person.name %>
26
- # <% end %>
27
- #
28
- # produces:
29
- #
30
- # <div id="person_123" class="person foo"> Joe Bloggs </div>
31
- # <div id="person_124" class="person foo"> Jane Bloggs </div>
32
- #
33
- def div_for(record, *args, &block)
34
- content_tag_for(:div, record, *args, &block)
35
- end
36
-
37
- # content_tag_for creates an HTML element with id and class parameters
38
- # that relate to the specified Active Record object. For example:
39
- #
40
- # <%= content_tag_for(:tr, @person) do %>
41
- # <td><%= @person.first_name %></td>
42
- # <td><%= @person.last_name %></td>
43
- # <% end %>
44
- #
45
- # would produce the following HTML (assuming @person is an instance of
46
- # a Person object, with an id value of 123):
47
- #
48
- # <tr id="person_123" class="person">....</tr>
49
- #
50
- # If you require the HTML id attribute to have a prefix, you can specify it:
51
- #
52
- # <%= content_tag_for(:tr, @person, :foo) do %> ...
53
- #
54
- # produces:
55
- #
56
- # <tr id="foo_person_123" class="person">...
57
- #
58
- # You can also pass an array of objects which this method will loop through
59
- # and yield the current object to the supplied block, reducing the need for
60
- # having to iterate through the object (using <tt>each</tt>) beforehand.
61
- # For example (assuming @people is an array of Person objects):
62
- #
63
- # <%= content_tag_for(:tr, @people) do |person| %>
64
- # <td><%= person.first_name %></td>
65
- # <td><%= person.last_name %></td>
66
- # <% end %>
67
- #
68
- # produces:
69
- #
70
- # <tr id="person_123" class="person">...</tr>
71
- # <tr id="person_124" class="person">...</tr>
72
- #
73
- # content_tag_for also accepts a hash of options, which will be converted to
74
- # additional HTML attributes. If you specify a <tt>:class</tt> value, it will be combined
75
- # with the default class name for your object. For example:
76
- #
77
- # <%= content_tag_for(:li, @person, :class => "bar") %>...
78
- #
79
- # produces:
80
- #
81
- # <li id="person_123" class="person bar">...
82
- #
83
- def content_tag_for(tag_name, single_or_multiple_records, prefix = nil, options = nil, &block)
84
- if single_or_multiple_records.respond_to?(:to_ary)
85
- single_or_multiple_records.to_ary.map do |single_record|
86
- capture { content_tag_for_single_record(tag_name, single_record, prefix, options, &block) }
87
- end.join("\n").html_safe
88
- else
89
- content_tag_for_single_record(tag_name, single_or_multiple_records, prefix, options, &block)
90
- end
91
- end
92
-
93
- private
94
-
95
- # Called by <tt>content_tag_for</tt> internally to render a content tag
96
- # for each record.
97
- def content_tag_for_single_record(tag_name, record, prefix, options, &block)
98
- options, prefix = prefix, nil if prefix.is_a?(Hash)
99
- options = options ? options.dup : {}
100
- options.merge!(:class => "#{dom_class(record, prefix)} #{options[:class]}".strip, :id => dom_id(record, prefix))
101
- if !block_given?
102
- content_tag(tag_name, "", options)
103
- elsif block.arity == 0
104
- content_tag(tag_name, capture(&block), options)
105
- else
106
- content_tag(tag_name, capture(record, &block), options)
107
- end
108
- end
109
- end
110
- end
111
- end
@@ -1,90 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- # = Action View Rendering
4
- #
5
- # Implements methods that allow rendering from a view context.
6
- # In order to use this module, all you need is to implement
7
- # view_renderer that returns an ActionView::Renderer object.
8
- module RenderingHelper
9
- # Returns the result of a render that's dictated by the options hash. The primary options are:
10
- #
11
- # * <tt>:partial</tt> - See <tt>ActionView::PartialRenderer</tt>.
12
- # * <tt>:file</tt> - Renders an explicit template file (this used to be the old default), add :locals to pass in those.
13
- # * <tt>:inline</tt> - Renders an inline template similar to how it's done in the controller.
14
- # * <tt>:text</tt> - Renders the text passed in out.
15
- #
16
- # If no options hash is passed or :update specified, the default is to render a partial and use the second parameter
17
- # as the locals hash.
18
- def render(options = {}, locals = {}, &block)
19
- case options
20
- when Hash
21
- if block_given?
22
- view_renderer.render_partial(self, options.merge(:partial => options[:layout]), &block)
23
- else
24
- view_renderer.render(self, options)
25
- end
26
- else
27
- view_renderer.render_partial(self, :partial => options, :locals => locals)
28
- end
29
- end
30
-
31
- # Overwrites _layout_for in the context object so it supports the case a block is
32
- # passed to a partial. Returns the contents that are yielded to a layout, given a
33
- # name or a block.
34
- #
35
- # You can think of a layout as a method that is called with a block. If the user calls
36
- # <tt>yield :some_name</tt>, the block, by default, returns <tt>content_for(:some_name)</tt>.
37
- # If the user calls simply +yield+, the default block returns <tt>content_for(:layout)</tt>.
38
- #
39
- # The user can override this default by passing a block to the layout:
40
- #
41
- # # The template
42
- # <%= render :layout => "my_layout" do %>
43
- # Content
44
- # <% end %>
45
- #
46
- # # The layout
47
- # <html>
48
- # <%= yield %>
49
- # </html>
50
- #
51
- # In this case, instead of the default block, which would return <tt>content_for(:layout)</tt>,
52
- # this method returns the block that was passed in to <tt>render :layout</tt>, and the response
53
- # would be
54
- #
55
- # <html>
56
- # Content
57
- # </html>
58
- #
59
- # Finally, the block can take block arguments, which can be passed in by +yield+:
60
- #
61
- # # The template
62
- # <%= render :layout => "my_layout" do |customer| %>
63
- # Hello <%= customer.name %>
64
- # <% end %>
65
- #
66
- # # The layout
67
- # <html>
68
- # <%= yield Struct.new(:name).new("David") %>
69
- # </html>
70
- #
71
- # In this case, the layout would receive the block passed into <tt>render :layout</tt>,
72
- # and the struct specified would be passed into the block as an argument. The result
73
- # would be
74
- #
75
- # <html>
76
- # Hello David
77
- # </html>
78
- #
79
- def _layout_for(*args, &block)
80
- name = args.first
81
-
82
- if block && !name.is_a?(Symbol)
83
- capture(*args, &block)
84
- else
85
- super
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,259 +0,0 @@
1
- require 'active_support/core_ext/object/try'
2
- require 'action_controller/vendor/html-scanner'
3
-
4
- module ActionView
5
- # = Action View Sanitize Helpers
6
- module Helpers #:nodoc:
7
- # The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements.
8
- # These helper methods extend Action View making them callable within your template files.
9
- module SanitizeHelper
10
- extend ActiveSupport::Concern
11
- # This +sanitize+ helper will html encode all tags and strip all attributes that
12
- # aren't specifically allowed.
13
- #
14
- # It also strips href/src tags with invalid protocols, like javascript: especially.
15
- # It does its best to counter any tricks that hackers may use, like throwing in
16
- # unicode/ascii/hex values to get past the javascript: filters. Check out
17
- # the extensive test suite.
18
- #
19
- # <%= sanitize @article.body %>
20
- #
21
- # You can add or remove tags/attributes if you want to customize it a bit.
22
- # See ActionView::Base for full docs on the available options. You can add
23
- # tags/attributes for single uses of +sanitize+ by passing either the
24
- # <tt>:attributes</tt> or <tt>:tags</tt> options:
25
- #
26
- # Normal Use
27
- #
28
- # <%= sanitize @article.body %>
29
- #
30
- # Custom Use (only the mentioned tags and attributes are allowed, nothing else)
31
- #
32
- # <%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style) %>
33
- #
34
- # Add table tags to the default allowed tags
35
- #
36
- # class Application < Rails::Application
37
- # config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
38
- # end
39
- #
40
- # Remove tags to the default allowed tags
41
- #
42
- # class Application < Rails::Application
43
- # config.after_initialize do
44
- # ActionView::Base.sanitized_allowed_tags.delete 'div'
45
- # end
46
- # end
47
- #
48
- # Change allowed default attributes
49
- #
50
- # class Application < Rails::Application
51
- # config.action_view.sanitized_allowed_attributes = 'id', 'class', 'style'
52
- # end
53
- #
54
- # Please note that sanitizing user-provided text does not guarantee that the
55
- # resulting markup is valid (conforming to a document type) or even well-formed.
56
- # The output may still contain e.g. unescaped '<', '>', '&' characters and
57
- # confuse browsers.
58
- #
59
- def sanitize(html, options = {})
60
- self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe)
61
- end
62
-
63
- # Sanitizes a block of CSS code. Used by +sanitize+ when it comes across a style attribute.
64
- def sanitize_css(style)
65
- self.class.white_list_sanitizer.sanitize_css(style)
66
- end
67
-
68
- # Strips all HTML tags from the +html+, including comments. This uses the
69
- # html-scanner tokenizer and so its HTML parsing ability is limited by
70
- # that of html-scanner.
71
- #
72
- # ==== Examples
73
- #
74
- # strip_tags("Strip <i>these</i> tags!")
75
- # # => Strip these tags!
76
- #
77
- # strip_tags("<b>Bold</b> no more! <a href='more.html'>See more here</a>...")
78
- # # => Bold no more! See more here...
79
- #
80
- # strip_tags("<div id='top-bar'>Welcome to my website!</div>")
81
- # # => Welcome to my website!
82
- def strip_tags(html)
83
- self.class.full_sanitizer.sanitize(html)
84
- end
85
-
86
- # Strips all link tags from +text+ leaving just the link text.
87
- #
88
- # ==== Examples
89
- # strip_links('<a href="http://www.rubyonrails.org">Ruby on Rails</a>')
90
- # # => Ruby on Rails
91
- #
92
- # strip_links('Please e-mail me at <a href="mailto:me@email.com">me@email.com</a>.')
93
- # # => Please e-mail me at me@email.com.
94
- #
95
- # strip_links('Blog: <a href="http://www.myblog.com/" class="nav" target=\"_blank\">Visit</a>.')
96
- # # => Blog: Visit.
97
- def strip_links(html)
98
- self.class.link_sanitizer.sanitize(html)
99
- end
100
-
101
- module ClassMethods #:nodoc:
102
- attr_writer :full_sanitizer, :link_sanitizer, :white_list_sanitizer
103
-
104
- def sanitized_protocol_separator
105
- white_list_sanitizer.protocol_separator
106
- end
107
-
108
- def sanitized_uri_attributes
109
- white_list_sanitizer.uri_attributes
110
- end
111
-
112
- def sanitized_bad_tags
113
- white_list_sanitizer.bad_tags
114
- end
115
-
116
- def sanitized_allowed_tags
117
- white_list_sanitizer.allowed_tags
118
- end
119
-
120
- def sanitized_allowed_attributes
121
- white_list_sanitizer.allowed_attributes
122
- end
123
-
124
- def sanitized_allowed_css_properties
125
- white_list_sanitizer.allowed_css_properties
126
- end
127
-
128
- def sanitized_allowed_css_keywords
129
- white_list_sanitizer.allowed_css_keywords
130
- end
131
-
132
- def sanitized_shorthand_css_properties
133
- white_list_sanitizer.shorthand_css_properties
134
- end
135
-
136
- def sanitized_allowed_protocols
137
- white_list_sanitizer.allowed_protocols
138
- end
139
-
140
- def sanitized_protocol_separator=(value)
141
- white_list_sanitizer.protocol_separator = value
142
- end
143
-
144
- # Gets the HTML::FullSanitizer instance used by +strip_tags+. Replace with
145
- # any object that responds to +sanitize+.
146
- #
147
- # class Application < Rails::Application
148
- # config.action_view.full_sanitizer = MySpecialSanitizer.new
149
- # end
150
- #
151
- def full_sanitizer
152
- @full_sanitizer ||= HTML::FullSanitizer.new
153
- end
154
-
155
- # Gets the HTML::LinkSanitizer instance used by +strip_links+. Replace with
156
- # any object that responds to +sanitize+.
157
- #
158
- # class Application < Rails::Application
159
- # config.action_view.link_sanitizer = MySpecialSanitizer.new
160
- # end
161
- #
162
- def link_sanitizer
163
- @link_sanitizer ||= HTML::LinkSanitizer.new
164
- end
165
-
166
- # Gets the HTML::WhiteListSanitizer instance used by sanitize and +sanitize_css+.
167
- # Replace with any object that responds to +sanitize+.
168
- #
169
- # class Application < Rails::Application
170
- # config.action_view.white_list_sanitizer = MySpecialSanitizer.new
171
- # end
172
- #
173
- def white_list_sanitizer
174
- @white_list_sanitizer ||= HTML::WhiteListSanitizer.new
175
- end
176
-
177
- # Adds valid HTML attributes that the +sanitize+ helper checks for URIs.
178
- #
179
- # class Application < Rails::Application
180
- # config.action_view.sanitized_uri_attributes = 'lowsrc', 'target'
181
- # end
182
- #
183
- def sanitized_uri_attributes=(attributes)
184
- HTML::WhiteListSanitizer.uri_attributes.merge(attributes)
185
- end
186
-
187
- # Adds to the Set of 'bad' tags for the +sanitize+ helper.
188
- #
189
- # class Application < Rails::Application
190
- # config.action_view.sanitized_bad_tags = 'embed', 'object'
191
- # end
192
- #
193
- def sanitized_bad_tags=(attributes)
194
- HTML::WhiteListSanitizer.bad_tags.merge(attributes)
195
- end
196
-
197
- # Adds to the Set of allowed tags for the +sanitize+ helper.
198
- #
199
- # class Application < Rails::Application
200
- # config.action_view.sanitized_allowed_tags = 'table', 'tr', 'td'
201
- # end
202
- #
203
- def sanitized_allowed_tags=(attributes)
204
- HTML::WhiteListSanitizer.allowed_tags.merge(attributes)
205
- end
206
-
207
- # Adds to the Set of allowed HTML attributes for the +sanitize+ helper.
208
- #
209
- # class Application < Rails::Application
210
- # config.action_view.sanitized_allowed_attributes = 'onclick', 'longdesc'
211
- # end
212
- #
213
- def sanitized_allowed_attributes=(attributes)
214
- HTML::WhiteListSanitizer.allowed_attributes.merge(attributes)
215
- end
216
-
217
- # Adds to the Set of allowed CSS properties for the #sanitize and +sanitize_css+ helpers.
218
- #
219
- # class Application < Rails::Application
220
- # config.action_view.sanitized_allowed_css_properties = 'expression'
221
- # end
222
- #
223
- def sanitized_allowed_css_properties=(attributes)
224
- HTML::WhiteListSanitizer.allowed_css_properties.merge(attributes)
225
- end
226
-
227
- # Adds to the Set of allowed CSS keywords for the +sanitize+ and +sanitize_css+ helpers.
228
- #
229
- # class Application < Rails::Application
230
- # config.action_view.sanitized_allowed_css_keywords = 'expression'
231
- # end
232
- #
233
- def sanitized_allowed_css_keywords=(attributes)
234
- HTML::WhiteListSanitizer.allowed_css_keywords.merge(attributes)
235
- end
236
-
237
- # Adds to the Set of allowed shorthand CSS properties for the +sanitize+ and +sanitize_css+ helpers.
238
- #
239
- # class Application < Rails::Application
240
- # config.action_view.sanitized_shorthand_css_properties = 'expression'
241
- # end
242
- #
243
- def sanitized_shorthand_css_properties=(attributes)
244
- HTML::WhiteListSanitizer.shorthand_css_properties.merge(attributes)
245
- end
246
-
247
- # Adds to the Set of allowed protocols for the +sanitize+ helper.
248
- #
249
- # class Application < Rails::Application
250
- # config.action_view.sanitized_allowed_protocols = 'ssh', 'feed'
251
- # end
252
- #
253
- def sanitized_allowed_protocols=(attributes)
254
- HTML::WhiteListSanitizer.allowed_protocols.merge(attributes)
255
- end
256
- end
257
- end
258
- end
259
- end
@@ -1,160 +0,0 @@
1
- require 'active_support/core_ext/object/blank'
2
- require 'active_support/core_ext/string/output_safety'
3
- require 'set'
4
-
5
- module ActionView
6
- # = Action View Tag Helpers
7
- module Helpers #:nodoc:
8
- # Provides methods to generate HTML tags programmatically when you can't use
9
- # a Builder. By default, they output XHTML compliant tags.
10
- module TagHelper
11
- extend ActiveSupport::Concern
12
- include CaptureHelper
13
-
14
- BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
15
- autoplay controls loop selected hidden scoped async
16
- defer reversed ismap seemless muted required
17
- autofocus novalidate formnovalidate open pubdate).to_set
18
- BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
19
-
20
- PRE_CONTENT_STRINGS = {
21
- :textarea => "\n"
22
- }
23
-
24
- # Returns an empty HTML tag of type +name+ which by default is XHTML
25
- # compliant. Set +open+ to true to create an open tag compatible
26
- # with HTML 4.0 and below. Add HTML attributes by passing an attributes
27
- # hash to +options+. Set +escape+ to false to disable attribute value
28
- # escaping.
29
- #
30
- # ==== Options
31
- # You can use symbols or strings for the attribute names.
32
- #
33
- # Use +true+ with boolean attributes that can render with no value, like
34
- # +disabled+ and +readonly+.
35
- #
36
- # HTML5 <tt>data-*</tt> attributes can be set with a single +data+ key
37
- # pointing to a hash of sub-attributes.
38
- #
39
- # To play nicely with JavaScript conventions sub-attributes are dasherized.
40
- # For example, a key +user_id+ would render as <tt>data-user-id</tt> and
41
- # thus accessed as <tt>dataset.userId</tt>.
42
- #
43
- # Values are encoded to JSON, with the exception of strings and symbols.
44
- # This may come in handy when using jQuery's HTML5-aware <tt>.data()<tt>
45
- # from 1.4.3.
46
- #
47
- # ==== Examples
48
- # tag("br")
49
- # # => <br />
50
- #
51
- # tag("br", nil, true)
52
- # # => <br>
53
- #
54
- # tag("input", :type => 'text', :disabled => true)
55
- # # => <input type="text" disabled="disabled" />
56
- #
57
- # tag("img", :src => "open & shut.png")
58
- # # => <img src="open &amp; shut.png" />
59
- #
60
- # tag("img", {:src => "open &amp; shut.png"}, false, false)
61
- # # => <img src="open &amp; shut.png" />
62
- #
63
- # tag("div", :data => {:name => 'Stephen', :city_state => %w(Chicago IL)})
64
- # # => <div data-name="Stephen" data-city-state="[&quot;Chicago&quot;,&quot;IL&quot;]" />
65
- def tag(name, options = nil, open = false, escape = true)
66
- "<#{name}#{tag_options(options, escape) if options}#{open ? ">" : " />"}".html_safe
67
- end
68
-
69
- # Returns an HTML block tag of type +name+ surrounding the +content+. Add
70
- # HTML attributes by passing an attributes hash to +options+.
71
- # Instead of passing the content as an argument, you can also use a block
72
- # in which case, you pass your +options+ as the second parameter.
73
- # Set escape to false to disable attribute value escaping.
74
- #
75
- # ==== Options
76
- # The +options+ hash is used with attributes with no value like (<tt>disabled</tt> and
77
- # <tt>readonly</tt>), which you can give a value of true in the +options+ hash. You can use
78
- # symbols or strings for the attribute names.
79
- #
80
- # ==== Examples
81
- # content_tag(:p, "Hello world!")
82
- # # => <p>Hello world!</p>
83
- # content_tag(:div, content_tag(:p, "Hello world!"), :class => "strong")
84
- # # => <div class="strong"><p>Hello world!</p></div>
85
- # content_tag("select", options, :multiple => true)
86
- # # => <select multiple="multiple">...options...</select>
87
- #
88
- # <%= content_tag :div, :class => "strong" do -%>
89
- # Hello world!
90
- # <% end -%>
91
- # # => <div class="strong">Hello world!</div>
92
- def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
93
- if block_given?
94
- options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
95
- content_tag_string(name, capture(&block), options, escape)
96
- else
97
- content_tag_string(name, content_or_options_with_block, options, escape)
98
- end
99
- end
100
-
101
- # Returns a CDATA section with the given +content+. CDATA sections
102
- # are used to escape blocks of text containing characters which would
103
- # otherwise be recognized as markup. CDATA sections begin with the string
104
- # <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
105
- #
106
- # ==== Examples
107
- # cdata_section("<hello world>")
108
- # # => <![CDATA[<hello world>]]>
109
- #
110
- # cdata_section(File.read("hello_world.txt"))
111
- # # => <![CDATA[<hello from a text file]]>
112
- def cdata_section(content)
113
- "<![CDATA[#{content}]]>".html_safe
114
- end
115
-
116
- # Returns an escaped version of +html+ without affecting existing escaped entities.
117
- #
118
- # ==== Examples
119
- # escape_once("1 < 2 &amp; 3")
120
- # # => "1 &lt; 2 &amp; 3"
121
- #
122
- # escape_once("&lt;&lt; Accept & Checkout")
123
- # # => "&lt;&lt; Accept &amp; Checkout"
124
- def escape_once(html)
125
- ActiveSupport::Multibyte.clean(html.to_s).gsub(/[\"><]|&(?!([a-zA-Z]+|(#\d+));)/) { |special| ERB::Util::HTML_ESCAPE[special] }
126
- end
127
-
128
- private
129
-
130
- def content_tag_string(name, content, options, escape = true)
131
- tag_options = tag_options(options, escape) if options
132
- "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{escape ? ERB::Util.h(content) : content}</#{name}>".html_safe
133
- end
134
-
135
- def tag_options(options, escape = true)
136
- unless options.blank?
137
- attrs = []
138
- options.each_pair do |key, value|
139
- if key.to_s == 'data' && value.is_a?(Hash)
140
- value.each do |k, v|
141
- unless v.is_a?(String) || v.is_a?(Symbol) || v.is_a?(BigDecimal)
142
- v = v.to_json
143
- end
144
- v = ERB::Util.html_escape(v) if escape
145
- attrs << %(data-#{k.to_s.dasherize}="#{v}")
146
- end
147
- elsif BOOLEAN_ATTRIBUTES.include?(key)
148
- attrs << %(#{key}="#{key}") if value
149
- elsif !value.nil?
150
- final_value = value.is_a?(Array) ? value.join(" ") : value
151
- final_value = ERB::Util.html_escape(final_value) if escape
152
- attrs << %(#{key}="#{final_value}")
153
- end
154
- end
155
- " #{attrs.sort * ' '}".html_safe unless attrs.empty?
156
- end
157
- end
158
- end
159
- end
160
- end