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
@@ -0,0 +1,64 @@
1
+ require 'action_view/helpers/tags/checkable'
2
+
3
+ module ActionView
4
+ module Helpers
5
+ module Tags
6
+ class CheckBox < Base #:nodoc:
7
+ include Checkable
8
+
9
+ def initialize(object_name, method_name, template_object, checked_value, unchecked_value, options)
10
+ @checked_value = checked_value
11
+ @unchecked_value = unchecked_value
12
+ super(object_name, method_name, template_object, options)
13
+ end
14
+
15
+ def render
16
+ options = @options.stringify_keys
17
+ options["type"] = "checkbox"
18
+ options["value"] = @checked_value
19
+ options["checked"] = "checked" if input_checked?(object, options)
20
+
21
+ if options["multiple"]
22
+ add_default_name_and_id_for_value(@checked_value, options)
23
+ options.delete("multiple")
24
+ else
25
+ add_default_name_and_id(options)
26
+ end
27
+
28
+ include_hidden = options.delete("include_hidden") { true }
29
+ checkbox = tag("input", options)
30
+
31
+ if include_hidden
32
+ hidden = hidden_field_for_checkbox(options)
33
+ hidden + checkbox
34
+ else
35
+ checkbox
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def checked?(value)
42
+ case value
43
+ when TrueClass, FalseClass
44
+ value == !!@checked_value
45
+ when NilClass
46
+ false
47
+ when String
48
+ value == @checked_value
49
+ else
50
+ if value.respond_to?(:include?)
51
+ value.include?(@checked_value)
52
+ else
53
+ value.to_i == @checked_value.to_i
54
+ end
55
+ end
56
+ end
57
+
58
+ def hidden_field_for_checkbox(options)
59
+ @unchecked_value ? tag("input", options.slice("name", "disabled", "form").merge!("type" => "hidden", "value" => @unchecked_value)) : "".html_safe
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,16 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ module Checkable
5
+ def input_checked?(object, options)
6
+ if options.has_key?("checked")
7
+ checked = options.delete "checked"
8
+ checked == true || checked == "checked"
9
+ else
10
+ checked?(value(object))
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,43 @@
1
+ require 'action_view/helpers/tags/collection_helpers'
2
+
3
+ module ActionView
4
+ module Helpers
5
+ module Tags
6
+ class CollectionCheckBoxes < Base
7
+ include CollectionHelpers
8
+
9
+ class CheckBoxBuilder < Builder
10
+ def check_box(extra_html_options={})
11
+ html_options = extra_html_options.merge(@input_html_options)
12
+ @template_object.check_box(@object_name, @method_name, html_options, @value, nil)
13
+ end
14
+ end
15
+
16
+ def render(&block)
17
+ rendered_collection = render_collection do |item, value, text, default_html_options|
18
+ default_html_options[:multiple] = true
19
+ builder = instantiate_builder(CheckBoxBuilder, item, value, text, default_html_options)
20
+
21
+ if block_given?
22
+ @template_object.capture(builder, &block)
23
+ else
24
+ render_component(builder)
25
+ end
26
+ end
27
+
28
+ # Append a hidden field to make sure something will be sent back to the
29
+ # server if all check boxes are unchecked.
30
+ hidden = @template_object.hidden_field_tag("#{tag_name}[]", "", :id => nil)
31
+
32
+ rendered_collection + hidden
33
+ end
34
+
35
+ private
36
+
37
+ def render_component(builder)
38
+ builder.check_box + builder.label
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,83 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ module CollectionHelpers
5
+ class Builder
6
+ attr_reader :object, :text, :value
7
+
8
+ def initialize(template_object, object_name, method_name, object,
9
+ sanitized_attribute_name, text, value, input_html_options)
10
+ @template_object = template_object
11
+ @object_name = object_name
12
+ @method_name = method_name
13
+ @object = object
14
+ @sanitized_attribute_name = sanitized_attribute_name
15
+ @text = text
16
+ @value = value
17
+ @input_html_options = input_html_options
18
+ end
19
+
20
+ def label(label_html_options={}, &block)
21
+ @template_object.label(@object_name, @sanitized_attribute_name, @text, label_html_options, &block)
22
+ end
23
+ end
24
+
25
+ def initialize(object_name, method_name, template_object, collection, value_method, text_method, options, html_options)
26
+ @collection = collection
27
+ @value_method = value_method
28
+ @text_method = text_method
29
+ @html_options = html_options
30
+
31
+ super(object_name, method_name, template_object, options)
32
+ end
33
+
34
+ private
35
+
36
+ def instantiate_builder(builder_class, item, value, text, html_options)
37
+ builder_class.new(@template_object, @object_name, @method_name, item,
38
+ sanitize_attribute_name(value), text, value, html_options)
39
+ end
40
+
41
+ # Generate default options for collection helpers, such as :checked and
42
+ # :disabled.
43
+ def default_html_options_for_collection(item, value) #:nodoc:
44
+ html_options = @html_options.dup
45
+
46
+ [:checked, :selected, :disabled].each do |option|
47
+ current_value = @options[option]
48
+ next if current_value.nil?
49
+
50
+ accept = if current_value.respond_to?(:call)
51
+ current_value.call(item)
52
+ else
53
+ Array(current_value).map(&:to_s).include?(value.to_s)
54
+ end
55
+
56
+ if accept
57
+ html_options[option] = true
58
+ elsif option == :checked
59
+ html_options[option] = false
60
+ end
61
+ end
62
+
63
+ html_options[:object] = @object
64
+ html_options
65
+ end
66
+
67
+ def sanitize_attribute_name(value) #:nodoc:
68
+ "#{sanitized_method_name}_#{sanitized_value(value)}"
69
+ end
70
+
71
+ def render_collection #:nodoc:
72
+ @collection.map do |item|
73
+ value = value_for_collection(item, @value_method)
74
+ text = value_for_collection(item, @text_method)
75
+ default_html_options = default_html_options_for_collection(item, value)
76
+
77
+ yield item, value, text, default_html_options
78
+ end.join.html_safe
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,36 @@
1
+ require 'action_view/helpers/tags/collection_helpers'
2
+
3
+ module ActionView
4
+ module Helpers
5
+ module Tags
6
+ class CollectionRadioButtons < Base
7
+ include CollectionHelpers
8
+
9
+ class RadioButtonBuilder < Builder
10
+ def radio_button(extra_html_options={})
11
+ html_options = extra_html_options.merge(@input_html_options)
12
+ @template_object.radio_button(@object_name, @method_name, @value, html_options)
13
+ end
14
+ end
15
+
16
+ def render(&block)
17
+ render_collection do |item, value, text, default_html_options|
18
+ builder = instantiate_builder(RadioButtonBuilder, item, value, text, default_html_options)
19
+
20
+ if block_given?
21
+ @template_object.capture(builder, &block)
22
+ else
23
+ render_component(builder)
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def render_component(builder)
31
+ builder.radio_button + builder.label
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class CollectionSelect < Base #:nodoc:
5
+ def initialize(object_name, method_name, template_object, collection, value_method, text_method, options, html_options)
6
+ @collection = collection
7
+ @value_method = value_method
8
+ @text_method = text_method
9
+ @html_options = html_options
10
+
11
+ super(object_name, method_name, template_object, options)
12
+ end
13
+
14
+ def render
15
+ option_tags_options = {
16
+ :selected => @options.fetch(:selected) { value(@object) },
17
+ :disabled => @options[:disabled]
18
+ }
19
+
20
+ select_content_tag(
21
+ options_from_collection_for_select(@collection, @value_method, @text_method, option_tags_options),
22
+ @options, @html_options
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class ColorField < TextField #:nodoc:
5
+ def render
6
+ options = @options.stringify_keys
7
+ options["value"] = @options.fetch("value") { validate_color_string(value(object)) }
8
+ @options = options
9
+ super
10
+ end
11
+
12
+ private
13
+
14
+ def validate_color_string(string)
15
+ regex = /#[0-9a-fA-F]{6}/
16
+ if regex.match(string)
17
+ string.downcase
18
+ else
19
+ "#000000"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class DateField < DatetimeField #:nodoc:
5
+ private
6
+
7
+ def format_date(value)
8
+ value.try(:strftime, "%Y-%m-%d")
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ require 'active_support/core_ext/time/calculations'
2
+
3
+ module ActionView
4
+ module Helpers
5
+ module Tags
6
+ class DateSelect < Base #:nodoc:
7
+ def initialize(object_name, method_name, template_object, options, html_options)
8
+ @html_options = html_options
9
+
10
+ super(object_name, method_name, template_object, options)
11
+ end
12
+
13
+ def render
14
+ error_wrapping(datetime_selector(@options, @html_options).send("select_#{select_type}").html_safe)
15
+ end
16
+
17
+ class << self
18
+ def select_type
19
+ @select_type ||= self.name.split("::").last.sub("Select", "").downcase
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def select_type
26
+ self.class.select_type
27
+ end
28
+
29
+ def datetime_selector(options, html_options)
30
+ datetime = options.fetch(:selected) { value(object) || default_datetime(options) }
31
+ @auto_index ||= nil
32
+
33
+ options = options.dup
34
+ options[:field_name] = @method_name
35
+ options[:include_position] = true
36
+ options[:prefix] ||= @object_name
37
+ options[:index] = @auto_index if @auto_index && !options.has_key?(:index)
38
+
39
+ DateTimeSelector.new(datetime, options, html_options)
40
+ end
41
+
42
+ def default_datetime(options)
43
+ return if options[:include_blank] || options[:prompt]
44
+
45
+ case options[:default]
46
+ when nil
47
+ Time.current
48
+ when Date, Time
49
+ options[:default]
50
+ else
51
+ default = options[:default].dup
52
+
53
+ # Rename :minute and :second to :min and :sec
54
+ default[:min] ||= default[:minute]
55
+ default[:sec] ||= default[:second]
56
+
57
+ time = Time.current
58
+
59
+ [:year, :month, :day, :hour, :min, :sec].each do |key|
60
+ default[key] ||= time.send(key)
61
+ end
62
+
63
+ Time.utc(
64
+ default[:year], default[:month], default[:day],
65
+ default[:hour], default[:min], default[:sec]
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,22 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class DatetimeField < TextField #:nodoc:
5
+ def render
6
+ options = @options.stringify_keys
7
+ options["value"] = @options.fetch("value") { format_date(value(object)) }
8
+ options["min"] = format_date(options["min"])
9
+ options["max"] = format_date(options["max"])
10
+ @options = options
11
+ super
12
+ end
13
+
14
+ private
15
+
16
+ def format_date(value)
17
+ value.try(:strftime, "%Y-%m-%dT%T.%L%z")
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class DatetimeLocalField < DatetimeField #:nodoc:
5
+ class << self
6
+ def field_type
7
+ @field_type ||= "datetime-local"
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def format_date(value)
14
+ value.try(:strftime, "%Y-%m-%dT%T")
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class DatetimeSelect < DateSelect #:nodoc:
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module ActionView
2
+ module Helpers
3
+ module Tags
4
+ class EmailField < TextField #:nodoc:
5
+ end
6
+ end
7
+ end
8
+ end