actionpack 4.0.1 → 4.2.11.1

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 (241) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +402 -1173
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/lib/abstract_controller/base.rb +39 -7
  6. data/lib/abstract_controller/callbacks.rb +32 -53
  7. data/lib/abstract_controller/collector.rb +11 -1
  8. data/lib/abstract_controller/helpers.rb +26 -16
  9. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  10. data/lib/abstract_controller/rendering.rb +57 -127
  11. data/lib/abstract_controller/url_for.rb +1 -1
  12. data/lib/abstract_controller.rb +1 -2
  13. data/lib/action_controller/base.rb +19 -10
  14. data/lib/action_controller/caching/fragments.rb +7 -1
  15. data/lib/action_controller/caching.rb +2 -12
  16. data/lib/action_controller/log_subscriber.rb +29 -20
  17. data/lib/action_controller/metal/conditional_get.rb +37 -12
  18. data/lib/action_controller/metal/data_streaming.rb +1 -1
  19. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  20. data/lib/action_controller/metal/exceptions.rb +1 -1
  21. data/lib/action_controller/metal/flash.rb +17 -0
  22. data/lib/action_controller/metal/force_ssl.rb +2 -2
  23. data/lib/action_controller/metal/head.rb +8 -6
  24. data/lib/action_controller/metal/helpers.rb +6 -2
  25. data/lib/action_controller/metal/http_authentication.rb +45 -23
  26. data/lib/action_controller/metal/instrumentation.rb +9 -6
  27. data/lib/action_controller/metal/live.rb +173 -20
  28. data/lib/action_controller/metal/mime_responds.rb +127 -232
  29. data/lib/action_controller/metal/params_wrapper.rb +16 -9
  30. data/lib/action_controller/metal/rack_delegation.rb +1 -1
  31. data/lib/action_controller/metal/redirecting.rb +34 -26
  32. data/lib/action_controller/metal/renderers.rb +39 -12
  33. data/lib/action_controller/metal/rendering.rb +41 -14
  34. data/lib/action_controller/metal/request_forgery_protection.rb +147 -19
  35. data/lib/action_controller/metal/streaming.rb +19 -21
  36. data/lib/action_controller/metal/strong_parameters.rb +166 -22
  37. data/lib/action_controller/metal/testing.rb +0 -1
  38. data/lib/action_controller/metal/url_for.rb +11 -12
  39. data/lib/action_controller/metal.rb +14 -8
  40. data/lib/action_controller/model_naming.rb +1 -1
  41. data/lib/action_controller/railtie.rb +5 -1
  42. data/lib/action_controller/test_case.rb +160 -94
  43. data/lib/action_controller.rb +2 -18
  44. data/lib/action_dispatch/http/cache.rb +5 -4
  45. data/lib/action_dispatch/http/filter_parameters.rb +2 -2
  46. data/lib/action_dispatch/http/filter_redirect.rb +5 -4
  47. data/lib/action_dispatch/http/headers.rb +46 -10
  48. data/lib/action_dispatch/http/mime_negotiation.rb +31 -4
  49. data/lib/action_dispatch/http/mime_type.rb +25 -26
  50. data/lib/action_dispatch/http/mime_types.rb +1 -0
  51. data/lib/action_dispatch/http/parameter_filter.rb +1 -1
  52. data/lib/action_dispatch/http/parameters.rb +25 -41
  53. data/lib/action_dispatch/http/request.rb +49 -32
  54. data/lib/action_dispatch/http/response.rb +127 -25
  55. data/lib/action_dispatch/http/upload.rb +9 -21
  56. data/lib/action_dispatch/http/url.rb +97 -70
  57. data/lib/action_dispatch/journey/formatter.rb +35 -19
  58. data/lib/action_dispatch/journey/gtg/builder.rb +3 -3
  59. data/lib/action_dispatch/journey/gtg/simulator.rb +10 -7
  60. data/lib/action_dispatch/journey/gtg/transition_table.rb +23 -33
  61. data/lib/action_dispatch/journey/nfa/dot.rb +2 -2
  62. data/lib/action_dispatch/journey/nfa/simulator.rb +1 -1
  63. data/lib/action_dispatch/journey/nfa/transition_table.rb +5 -5
  64. data/lib/action_dispatch/journey/nodes/node.rb +4 -0
  65. data/lib/action_dispatch/journey/parser.rb +51 -59
  66. data/lib/action_dispatch/journey/parser.y +12 -10
  67. data/lib/action_dispatch/journey/path/pattern.rb +16 -19
  68. data/lib/action_dispatch/journey/route.rb +8 -19
  69. data/lib/action_dispatch/journey/router/strexp.rb +9 -6
  70. data/lib/action_dispatch/journey/router/utils.rb +54 -18
  71. data/lib/action_dispatch/journey/router.rb +53 -75
  72. data/lib/action_dispatch/journey/routes.rb +4 -0
  73. data/lib/action_dispatch/journey/scanner.rb +5 -5
  74. data/lib/action_dispatch/journey/visitors.rb +81 -60
  75. data/lib/action_dispatch/journey/visualizer/fsm.css +0 -4
  76. data/lib/action_dispatch/journey/visualizer/index.html.erb +2 -2
  77. data/lib/action_dispatch/middleware/callbacks.rb +7 -7
  78. data/lib/action_dispatch/middleware/cookies.rb +119 -43
  79. data/lib/action_dispatch/middleware/debug_exceptions.rb +32 -13
  80. data/lib/action_dispatch/middleware/exception_wrapper.rb +60 -20
  81. data/lib/action_dispatch/middleware/flash.rb +37 -24
  82. data/lib/action_dispatch/middleware/params_parser.rb +2 -2
  83. data/lib/action_dispatch/middleware/public_exceptions.rb +12 -3
  84. data/lib/action_dispatch/middleware/reloader.rb +11 -2
  85. data/lib/action_dispatch/middleware/remote_ip.rb +40 -54
  86. data/lib/action_dispatch/middleware/request_id.rb +1 -1
  87. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  88. data/lib/action_dispatch/middleware/session/cookie_store.rb +8 -7
  89. data/lib/action_dispatch/middleware/show_exceptions.rb +6 -2
  90. data/lib/action_dispatch/middleware/ssl.rb +10 -7
  91. data/lib/action_dispatch/middleware/static.rb +79 -23
  92. data/lib/action_dispatch/middleware/templates/rescues/{_request_and_response.erb → _request_and_response.html.erb} +0 -0
  93. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  94. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +21 -19
  95. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  96. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  97. data/lib/action_dispatch/middleware/templates/rescues/{diagnostics.erb → diagnostics.html.erb} +1 -1
  98. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  99. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +6 -0
  100. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  101. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  102. data/lib/action_dispatch/middleware/templates/rescues/{routing_error.erb → routing_error.html.erb} +3 -1
  103. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  104. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  105. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  106. data/lib/action_dispatch/middleware/templates/rescues/{unknown_action.erb → unknown_action.html.erb} +1 -1
  107. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  108. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +120 -64
  109. data/lib/action_dispatch/railtie.rb +5 -2
  110. data/lib/action_dispatch/request/session.rb +12 -0
  111. data/lib/action_dispatch/request/utils.rb +35 -0
  112. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  113. data/lib/action_dispatch/routing/inspector.rb +11 -17
  114. data/lib/action_dispatch/routing/mapper.rb +519 -312
  115. data/lib/action_dispatch/routing/polymorphic_routes.rb +204 -79
  116. data/lib/action_dispatch/routing/redirection.rb +51 -26
  117. data/lib/action_dispatch/routing/route_set.rb +331 -206
  118. data/lib/action_dispatch/routing/routes_proxy.rb +5 -4
  119. data/lib/action_dispatch/routing/url_for.rb +19 -5
  120. data/lib/action_dispatch/routing.rb +9 -6
  121. data/lib/action_dispatch/testing/assertions/dom.rb +2 -26
  122. data/lib/action_dispatch/testing/assertions/response.rb +9 -15
  123. data/lib/action_dispatch/testing/assertions/routing.rb +22 -22
  124. data/lib/action_dispatch/testing/assertions/selector.rb +2 -429
  125. data/lib/action_dispatch/testing/assertions/tag.rb +2 -134
  126. data/lib/action_dispatch/testing/assertions.rb +11 -7
  127. data/lib/action_dispatch/testing/integration.rb +31 -29
  128. data/lib/action_dispatch/testing/test_request.rb +1 -1
  129. data/lib/action_dispatch/testing/test_response.rb +1 -5
  130. data/lib/action_dispatch.rb +5 -8
  131. data/lib/action_pack/gem_version.rb +15 -0
  132. data/lib/action_pack/version.rb +4 -7
  133. data/lib/action_pack.rb +1 -1
  134. metadata +77 -159
  135. data/lib/abstract_controller/layouts.rb +0 -423
  136. data/lib/abstract_controller/view_paths.rb +0 -96
  137. data/lib/action_controller/deprecated/integration_test.rb +0 -5
  138. data/lib/action_controller/deprecated.rb +0 -7
  139. data/lib/action_controller/metal/responder.rb +0 -287
  140. data/lib/action_controller/record_identifier.rb +0 -31
  141. data/lib/action_controller/vendor/html-scanner.rb +0 -5
  142. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -24
  143. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -7
  144. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -43
  145. data/lib/action_view/base.rb +0 -201
  146. data/lib/action_view/buffers.rb +0 -49
  147. data/lib/action_view/context.rb +0 -36
  148. data/lib/action_view/dependency_tracker.rb +0 -93
  149. data/lib/action_view/digestor.rb +0 -113
  150. data/lib/action_view/flows.rb +0 -76
  151. data/lib/action_view/helpers/active_model_helper.rb +0 -49
  152. data/lib/action_view/helpers/asset_tag_helper.rb +0 -320
  153. data/lib/action_view/helpers/asset_url_helper.rb +0 -355
  154. data/lib/action_view/helpers/atom_feed_helper.rb +0 -203
  155. data/lib/action_view/helpers/cache_helper.rb +0 -196
  156. data/lib/action_view/helpers/capture_helper.rb +0 -216
  157. data/lib/action_view/helpers/controller_helper.rb +0 -25
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -30
  159. data/lib/action_view/helpers/date_helper.rb +0 -1083
  160. data/lib/action_view/helpers/debug_helper.rb +0 -39
  161. data/lib/action_view/helpers/form_helper.rb +0 -1880
  162. data/lib/action_view/helpers/form_options_helper.rb +0 -838
  163. data/lib/action_view/helpers/form_tag_helper.rb +0 -785
  164. data/lib/action_view/helpers/javascript_helper.rb +0 -117
  165. data/lib/action_view/helpers/number_helper.rb +0 -441
  166. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  167. data/lib/action_view/helpers/record_tag_helper.rb +0 -106
  168. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  169. data/lib/action_view/helpers/sanitize_helper.rb +0 -256
  170. data/lib/action_view/helpers/tag_helper.rb +0 -173
  171. data/lib/action_view/helpers/tags/base.rb +0 -148
  172. data/lib/action_view/helpers/tags/check_box.rb +0 -64
  173. data/lib/action_view/helpers/tags/checkable.rb +0 -16
  174. data/lib/action_view/helpers/tags/collection_check_boxes.rb +0 -44
  175. data/lib/action_view/helpers/tags/collection_helpers.rb +0 -84
  176. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +0 -36
  177. data/lib/action_view/helpers/tags/collection_select.rb +0 -28
  178. data/lib/action_view/helpers/tags/color_field.rb +0 -25
  179. data/lib/action_view/helpers/tags/date_field.rb +0 -13
  180. data/lib/action_view/helpers/tags/date_select.rb +0 -72
  181. data/lib/action_view/helpers/tags/datetime_field.rb +0 -22
  182. data/lib/action_view/helpers/tags/datetime_local_field.rb +0 -19
  183. data/lib/action_view/helpers/tags/datetime_select.rb +0 -8
  184. data/lib/action_view/helpers/tags/email_field.rb +0 -8
  185. data/lib/action_view/helpers/tags/file_field.rb +0 -8
  186. data/lib/action_view/helpers/tags/grouped_collection_select.rb +0 -29
  187. data/lib/action_view/helpers/tags/hidden_field.rb +0 -8
  188. data/lib/action_view/helpers/tags/label.rb +0 -66
  189. data/lib/action_view/helpers/tags/month_field.rb +0 -13
  190. data/lib/action_view/helpers/tags/number_field.rb +0 -18
  191. data/lib/action_view/helpers/tags/password_field.rb +0 -12
  192. data/lib/action_view/helpers/tags/radio_button.rb +0 -31
  193. data/lib/action_view/helpers/tags/range_field.rb +0 -8
  194. data/lib/action_view/helpers/tags/search_field.rb +0 -24
  195. data/lib/action_view/helpers/tags/select.rb +0 -40
  196. data/lib/action_view/helpers/tags/tel_field.rb +0 -8
  197. data/lib/action_view/helpers/tags/text_area.rb +0 -18
  198. data/lib/action_view/helpers/tags/text_field.rb +0 -29
  199. data/lib/action_view/helpers/tags/time_field.rb +0 -13
  200. data/lib/action_view/helpers/tags/time_select.rb +0 -8
  201. data/lib/action_view/helpers/tags/time_zone_select.rb +0 -20
  202. data/lib/action_view/helpers/tags/url_field.rb +0 -8
  203. data/lib/action_view/helpers/tags/week_field.rb +0 -13
  204. data/lib/action_view/helpers/tags.rb +0 -39
  205. data/lib/action_view/helpers/text_helper.rb +0 -443
  206. data/lib/action_view/helpers/translation_helper.rb +0 -107
  207. data/lib/action_view/helpers/url_helper.rb +0 -635
  208. data/lib/action_view/helpers.rb +0 -58
  209. data/lib/action_view/locale/en.yml +0 -56
  210. data/lib/action_view/log_subscriber.rb +0 -30
  211. data/lib/action_view/lookup_context.rb +0 -241
  212. data/lib/action_view/model_naming.rb +0 -12
  213. data/lib/action_view/path_set.rb +0 -77
  214. data/lib/action_view/railtie.rb +0 -43
  215. data/lib/action_view/record_identifier.rb +0 -84
  216. data/lib/action_view/renderer/abstract_renderer.rb +0 -47
  217. data/lib/action_view/renderer/partial_renderer.rb +0 -492
  218. data/lib/action_view/renderer/renderer.rb +0 -50
  219. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -103
  220. data/lib/action_view/renderer/template_renderer.rb +0 -96
  221. data/lib/action_view/routing_url_for.rb +0 -107
  222. data/lib/action_view/tasks/dependencies.rake +0 -17
  223. data/lib/action_view/template/error.rb +0 -138
  224. data/lib/action_view/template/handlers/builder.rb +0 -26
  225. data/lib/action_view/template/handlers/erb.rb +0 -146
  226. data/lib/action_view/template/handlers/raw.rb +0 -11
  227. data/lib/action_view/template/handlers.rb +0 -53
  228. data/lib/action_view/template/resolver.rb +0 -326
  229. data/lib/action_view/template/text.rb +0 -34
  230. data/lib/action_view/template/types.rb +0 -57
  231. data/lib/action_view/template.rb +0 -339
  232. data/lib/action_view/test_case.rb +0 -270
  233. data/lib/action_view/testing/resolvers.rb +0 -50
  234. data/lib/action_view/vendor/html-scanner/html/document.rb +0 -68
  235. data/lib/action_view/vendor/html-scanner/html/node.rb +0 -532
  236. data/lib/action_view/vendor/html-scanner/html/sanitizer.rb +0 -188
  237. data/lib/action_view/vendor/html-scanner/html/selector.rb +0 -830
  238. data/lib/action_view/vendor/html-scanner/html/tokenizer.rb +0 -107
  239. data/lib/action_view/vendor/html-scanner/html/version.rb +0 -11
  240. data/lib/action_view/vendor/html-scanner.rb +0 -20
  241. data/lib/action_view.rb +0 -93
@@ -1,148 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class Base # :nodoc:
5
- include Helpers::ActiveModelInstanceTag, Helpers::TagHelper, Helpers::FormTagHelper
6
- include FormOptionsHelper
7
-
8
- attr_reader :object
9
-
10
- def initialize(object_name, method_name, template_object, options = {})
11
- @object_name, @method_name = object_name.to_s.dup, method_name.to_s.dup
12
- @template_object = template_object
13
-
14
- @object_name.sub!(/\[\]$/,"") || @object_name.sub!(/\[\]\]$/,"]")
15
- @object = retrieve_object(options.delete(:object))
16
- @options = options
17
- @auto_index = retrieve_autoindex(Regexp.last_match.pre_match) if Regexp.last_match
18
- end
19
-
20
- # This is what child classes implement.
21
- def render
22
- raise NotImplementedError, "Subclasses must implement a render method"
23
- end
24
-
25
- private
26
-
27
- def value(object)
28
- object.send @method_name if object
29
- end
30
-
31
- def value_before_type_cast(object)
32
- unless object.nil?
33
- method_before_type_cast = @method_name + "_before_type_cast"
34
-
35
- object.respond_to?(method_before_type_cast) ?
36
- object.send(method_before_type_cast) :
37
- value(object)
38
- end
39
- end
40
-
41
- def retrieve_object(object)
42
- if object
43
- object
44
- elsif @template_object.instance_variable_defined?("@#{@object_name}")
45
- @template_object.instance_variable_get("@#{@object_name}")
46
- end
47
- rescue NameError
48
- # As @object_name may contain the nested syntax (item[subobject]) we need to fallback to nil.
49
- nil
50
- end
51
-
52
- def retrieve_autoindex(pre_match)
53
- object = self.object || @template_object.instance_variable_get("@#{pre_match}")
54
- if object && object.respond_to?(:to_param)
55
- object.to_param
56
- else
57
- raise ArgumentError, "object[] naming but object param and @object var don't exist or don't respond to to_param: #{object.inspect}"
58
- end
59
- end
60
-
61
- def add_default_name_and_id_for_value(tag_value, options)
62
- if tag_value.nil?
63
- add_default_name_and_id(options)
64
- else
65
- specified_id = options["id"]
66
- add_default_name_and_id(options)
67
-
68
- if specified_id.blank? && options["id"].present?
69
- options["id"] += "_#{sanitized_value(tag_value)}"
70
- end
71
- end
72
- end
73
-
74
- def add_default_name_and_id(options)
75
- if options.has_key?("index")
76
- options["name"] ||= options.fetch("name"){ tag_name_with_index(options["index"], options["multiple"]) }
77
- options["id"] = options.fetch("id"){ tag_id_with_index(options["index"]) }
78
- options.delete("index")
79
- elsif defined?(@auto_index)
80
- options["name"] ||= options.fetch("name"){ tag_name_with_index(@auto_index, options["multiple"]) }
81
- options["id"] = options.fetch("id"){ tag_id_with_index(@auto_index) }
82
- else
83
- options["name"] ||= options.fetch("name"){ tag_name(options["multiple"]) }
84
- options["id"] = options.fetch("id"){ tag_id }
85
- end
86
-
87
- options["id"] = [options.delete('namespace'), options["id"]].compact.join("_").presence
88
- end
89
-
90
- def tag_name(multiple = false)
91
- "#{@object_name}[#{sanitized_method_name}]#{"[]" if multiple}"
92
- end
93
-
94
- def tag_name_with_index(index, multiple = false)
95
- "#{@object_name}[#{index}][#{sanitized_method_name}]#{"[]" if multiple}"
96
- end
97
-
98
- def tag_id
99
- "#{sanitized_object_name}_#{sanitized_method_name}"
100
- end
101
-
102
- def tag_id_with_index(index)
103
- "#{sanitized_object_name}_#{index}_#{sanitized_method_name}"
104
- end
105
-
106
- def sanitized_object_name
107
- @sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "")
108
- end
109
-
110
- def sanitized_method_name
111
- @sanitized_method_name ||= @method_name.sub(/\?$/,"")
112
- end
113
-
114
- def sanitized_value(value)
115
- value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase
116
- end
117
-
118
- def select_content_tag(option_tags, options, html_options)
119
- html_options = html_options.stringify_keys
120
- add_default_name_and_id(html_options)
121
- options[:include_blank] ||= true unless options[:prompt] || select_not_required?(html_options)
122
- value = options.fetch(:selected) { value(object) }
123
- select = content_tag("select", add_options(option_tags, options, value), html_options)
124
-
125
- if html_options["multiple"] && options.fetch(:include_hidden, true)
126
- tag("input", :disabled => html_options["disabled"], :name => html_options["name"], :type => "hidden", :value => "") + select
127
- else
128
- select
129
- end
130
- end
131
-
132
- def select_not_required?(html_options)
133
- !html_options["required"] || html_options["multiple"] || html_options["size"].to_i > 1
134
- end
135
-
136
- def add_options(option_tags, options, value = nil)
137
- if options[:include_blank]
138
- option_tags = content_tag_string('option', options[:include_blank].kind_of?(String) ? options[:include_blank] : nil, :value => '') + "\n" + option_tags
139
- end
140
- if value.blank? && options[:prompt]
141
- option_tags = content_tag_string('option', prompt_text(options[:prompt]), :value => '') + "\n" + option_tags
142
- end
143
- option_tags
144
- end
145
- end
146
- end
147
- end
148
- end
@@ -1,64 +0,0 @@
1
- require 'action_view/helpers/tags/checkable'
2
-
3
- module ActionView
4
- module Helpers
5
- module Tags # :nodoc:
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
@@ -1,16 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- module Checkable # :nodoc:
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
@@ -1,44 +0,0 @@
1
- require 'action_view/helpers/tags/collection_helpers'
2
-
3
- module ActionView
4
- module Helpers
5
- module Tags # :nodoc:
6
- class CollectionCheckBoxes < Base # :nodoc:
7
- include CollectionHelpers
8
-
9
- class CheckBoxBuilder < Builder # :nodoc:
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_name = @html_options[:name] || "#{tag_name}[]"
31
- hidden = @template_object.hidden_field_tag(hidden_name, "", :id => nil)
32
-
33
- rendered_collection + hidden
34
- end
35
-
36
- private
37
-
38
- def render_component(builder)
39
- builder.check_box + builder.label
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,84 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- module CollectionHelpers # :nodoc:
5
- class Builder # :nodoc:
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
- html_options = label_html_options.merge(@input_html_options)
22
- @template_object.label(@object_name, @sanitized_attribute_name, @text, html_options, &block)
23
- end
24
- end
25
-
26
- def initialize(object_name, method_name, template_object, collection, value_method, text_method, options, html_options)
27
- @collection = collection
28
- @value_method = value_method
29
- @text_method = text_method
30
- @html_options = html_options
31
-
32
- super(object_name, method_name, template_object, options)
33
- end
34
-
35
- private
36
-
37
- def instantiate_builder(builder_class, item, value, text, html_options)
38
- builder_class.new(@template_object, @object_name, @method_name, item,
39
- sanitize_attribute_name(value), text, value, html_options)
40
- end
41
-
42
- # Generate default options for collection helpers, such as :checked and
43
- # :disabled.
44
- def default_html_options_for_collection(item, value) #:nodoc:
45
- html_options = @html_options.dup
46
-
47
- [:checked, :selected, :disabled].each do |option|
48
- current_value = @options[option]
49
- next if current_value.nil?
50
-
51
- accept = if current_value.respond_to?(:call)
52
- current_value.call(item)
53
- else
54
- Array(current_value).map(&:to_s).include?(value.to_s)
55
- end
56
-
57
- if accept
58
- html_options[option] = true
59
- elsif option == :checked
60
- html_options[option] = false
61
- end
62
- end
63
-
64
- html_options[:object] = @object
65
- html_options
66
- end
67
-
68
- def sanitize_attribute_name(value) #:nodoc:
69
- "#{sanitized_method_name}_#{sanitized_value(value)}"
70
- end
71
-
72
- def render_collection #:nodoc:
73
- @collection.map do |item|
74
- value = value_for_collection(item, @value_method)
75
- text = value_for_collection(item, @text_method)
76
- default_html_options = default_html_options_for_collection(item, value)
77
-
78
- yield item, value, text, default_html_options
79
- end.join.html_safe
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,36 +0,0 @@
1
- require 'action_view/helpers/tags/collection_helpers'
2
-
3
- module ActionView
4
- module Helpers
5
- module Tags # :nodoc:
6
- class CollectionRadioButtons < Base # :nodoc:
7
- include CollectionHelpers
8
-
9
- class RadioButtonBuilder < Builder # :nodoc:
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
@@ -1,28 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
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
@@ -1,25 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
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
@@ -1,13 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
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
@@ -1,72 +0,0 @@
1
- require 'active_support/core_ext/time/calculations'
2
-
3
- module ActionView
4
- module Helpers
5
- module Tags # :nodoc:
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
@@ -1,22 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
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
@@ -1,19 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
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
@@ -1,8 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class DatetimeSelect < DateSelect # :nodoc:
5
- end
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class EmailField < TextField # :nodoc:
5
- end
6
- end
7
- end
8
- end
@@ -1,8 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class FileField < TextField # :nodoc:
5
- end
6
- end
7
- end
8
- end
@@ -1,29 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class GroupedCollectionSelect < Base # :nodoc:
5
- def initialize(object_name, method_name, template_object, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
6
- @collection = collection
7
- @group_method = group_method
8
- @group_label_method = group_label_method
9
- @option_key_method = option_key_method
10
- @option_value_method = option_value_method
11
- @html_options = html_options
12
-
13
- super(object_name, method_name, template_object, options)
14
- end
15
-
16
- def render
17
- option_tags_options = {
18
- :selected => @options.fetch(:selected) { value(@object) },
19
- :disabled => @options[:disabled]
20
- }
21
-
22
- select_content_tag(
23
- option_groups_from_collection_for_select(@collection, @group_method, @group_label_method, @option_key_method, @option_value_method, option_tags_options), @options, @html_options
24
- )
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,8 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags # :nodoc:
4
- class HiddenField < TextField # :nodoc:
5
- end
6
- end
7
- end
8
- end