actionpack 4.0.13 → 4.1.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +131 -1636
  3. data/README.rdoc +1 -6
  4. data/lib/abstract_controller.rb +1 -2
  5. data/lib/abstract_controller/base.rb +3 -25
  6. data/lib/abstract_controller/callbacks.rb +4 -2
  7. data/lib/abstract_controller/collector.rb +11 -1
  8. data/lib/abstract_controller/helpers.rb +18 -15
  9. data/lib/abstract_controller/rendering.rb +48 -127
  10. data/lib/action_controller.rb +1 -17
  11. data/lib/action_controller/base.rb +14 -6
  12. data/lib/action_controller/caching.rb +1 -11
  13. data/lib/action_controller/log_subscriber.rb +1 -1
  14. data/lib/action_controller/metal.rb +0 -4
  15. data/lib/action_controller/metal/flash.rb +17 -0
  16. data/lib/action_controller/metal/force_ssl.rb +1 -1
  17. data/lib/action_controller/metal/head.rb +1 -3
  18. data/lib/action_controller/metal/helpers.rb +6 -2
  19. data/lib/action_controller/metal/http_authentication.rb +7 -14
  20. data/lib/action_controller/metal/instrumentation.rb +1 -1
  21. data/lib/action_controller/metal/live.rb +74 -0
  22. data/lib/action_controller/metal/mime_responds.rb +93 -16
  23. data/lib/action_controller/metal/params_wrapper.rb +4 -11
  24. data/lib/action_controller/metal/rack_delegation.rb +1 -1
  25. data/lib/action_controller/metal/redirecting.rb +20 -20
  26. data/lib/action_controller/metal/renderers.rb +8 -5
  27. data/lib/action_controller/metal/rendering.rb +14 -11
  28. data/lib/action_controller/metal/request_forgery_protection.rb +67 -13
  29. data/lib/action_controller/metal/responder.rb +12 -2
  30. data/lib/action_controller/metal/streaming.rb +18 -20
  31. data/lib/action_controller/metal/strong_parameters.rb +22 -34
  32. data/lib/action_controller/railtie.rb +0 -1
  33. data/lib/action_controller/test_case.rb +0 -15
  34. data/lib/action_dispatch.rb +1 -0
  35. data/lib/action_dispatch/http/headers.rb +1 -3
  36. data/lib/action_dispatch/http/mime_negotiation.rb +16 -2
  37. data/lib/action_dispatch/http/mime_type.rb +4 -22
  38. data/lib/action_dispatch/http/mime_types.rb +1 -0
  39. data/lib/action_dispatch/http/parameters.rb +18 -19
  40. data/lib/action_dispatch/http/request.rb +16 -25
  41. data/lib/action_dispatch/http/response.rb +21 -8
  42. data/lib/action_dispatch/http/upload.rb +0 -13
  43. data/lib/action_dispatch/http/url.rb +10 -18
  44. data/lib/action_dispatch/journey/formatter.rb +3 -3
  45. data/lib/action_dispatch/journey/gtg/transition_table.rb +3 -5
  46. data/lib/action_dispatch/journey/parser.rb +1 -1
  47. data/lib/action_dispatch/journey/parser.y +1 -0
  48. data/lib/action_dispatch/journey/router.rb +7 -1
  49. data/lib/action_dispatch/journey/router/utils.rb +1 -1
  50. data/lib/action_dispatch/journey/visitors.rb +26 -47
  51. data/lib/action_dispatch/middleware/callbacks.rb +6 -6
  52. data/lib/action_dispatch/middleware/cookies.rb +15 -15
  53. data/lib/action_dispatch/middleware/debug_exceptions.rb +21 -13
  54. data/lib/action_dispatch/middleware/exception_wrapper.rb +1 -1
  55. data/lib/action_dispatch/middleware/flash.rb +5 -11
  56. data/lib/action_dispatch/middleware/params_parser.rb +1 -1
  57. data/lib/action_dispatch/middleware/public_exceptions.rb +1 -5
  58. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  59. data/lib/action_dispatch/middleware/session/cookie_store.rb +4 -3
  60. data/lib/action_dispatch/middleware/show_exceptions.rb +5 -2
  61. data/lib/action_dispatch/middleware/ssl.rb +1 -1
  62. data/lib/action_dispatch/middleware/static.rb +5 -25
  63. data/lib/action_dispatch/middleware/templates/rescues/{_request_and_response.erb → _request_and_response.html.erb} +0 -0
  64. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  65. data/lib/action_dispatch/middleware/templates/rescues/{_trace.erb → _trace.html.erb} +0 -0
  66. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +15 -0
  67. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +1 -1
  68. data/lib/action_dispatch/middleware/templates/rescues/{missing_template.erb → missing_template.html.erb} +1 -1
  69. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  70. data/lib/action_dispatch/middleware/templates/rescues/{routing_error.erb → routing_error.html.erb} +1 -1
  71. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  72. data/lib/action_dispatch/middleware/templates/rescues/{template_error.erb → template_error.html.erb} +1 -1
  73. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +8 -0
  74. data/lib/action_dispatch/middleware/templates/rescues/{unknown_action.erb → unknown_action.html.erb} +1 -1
  75. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  76. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +3 -3
  77. data/lib/action_dispatch/railtie.rb +1 -2
  78. data/lib/action_dispatch/request/session.rb +12 -0
  79. data/lib/action_dispatch/request/utils.rb +24 -0
  80. data/lib/action_dispatch/routing.rb +7 -6
  81. data/lib/action_dispatch/routing/inspector.rb +4 -4
  82. data/lib/action_dispatch/routing/mapper.rb +81 -138
  83. data/lib/action_dispatch/routing/polymorphic_routes.rb +13 -0
  84. data/lib/action_dispatch/routing/redirection.rb +34 -27
  85. data/lib/action_dispatch/routing/route_set.rb +43 -37
  86. data/lib/action_dispatch/routing/url_for.rb +3 -1
  87. data/lib/action_dispatch/testing/assertions/response.rb +8 -15
  88. data/lib/action_dispatch/testing/assertions/selector.rb +4 -4
  89. data/lib/action_dispatch/testing/integration.rb +1 -7
  90. data/lib/action_pack/version.rb +1 -1
  91. metadata +43 -167
  92. data/lib/abstract_controller/layouts.rb +0 -423
  93. data/lib/abstract_controller/view_paths.rb +0 -96
  94. data/lib/action_controller/deprecated.rb +0 -7
  95. data/lib/action_controller/deprecated/integration_test.rb +0 -5
  96. data/lib/action_controller/record_identifier.rb +0 -31
  97. data/lib/action_controller/vendor/html-scanner.rb +0 -5
  98. data/lib/action_view.rb +0 -93
  99. data/lib/action_view/base.rb +0 -205
  100. data/lib/action_view/buffers.rb +0 -49
  101. data/lib/action_view/context.rb +0 -36
  102. data/lib/action_view/dependency_tracker.rb +0 -93
  103. data/lib/action_view/digestor.rb +0 -113
  104. data/lib/action_view/flows.rb +0 -76
  105. data/lib/action_view/helpers.rb +0 -58
  106. data/lib/action_view/helpers/active_model_helper.rb +0 -49
  107. data/lib/action_view/helpers/asset_tag_helper.rb +0 -320
  108. data/lib/action_view/helpers/asset_url_helper.rb +0 -355
  109. data/lib/action_view/helpers/atom_feed_helper.rb +0 -203
  110. data/lib/action_view/helpers/cache_helper.rb +0 -196
  111. data/lib/action_view/helpers/capture_helper.rb +0 -216
  112. data/lib/action_view/helpers/controller_helper.rb +0 -25
  113. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  114. data/lib/action_view/helpers/date_helper.rb +0 -1087
  115. data/lib/action_view/helpers/debug_helper.rb +0 -39
  116. data/lib/action_view/helpers/form_helper.rb +0 -1882
  117. data/lib/action_view/helpers/form_options_helper.rb +0 -838
  118. data/lib/action_view/helpers/form_tag_helper.rb +0 -785
  119. data/lib/action_view/helpers/javascript_helper.rb +0 -117
  120. data/lib/action_view/helpers/number_helper.rb +0 -451
  121. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  122. data/lib/action_view/helpers/record_tag_helper.rb +0 -106
  123. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  124. data/lib/action_view/helpers/sanitize_helper.rb +0 -256
  125. data/lib/action_view/helpers/tag_helper.rb +0 -173
  126. data/lib/action_view/helpers/tags.rb +0 -39
  127. data/lib/action_view/helpers/tags/base.rb +0 -148
  128. data/lib/action_view/helpers/tags/check_box.rb +0 -64
  129. data/lib/action_view/helpers/tags/checkable.rb +0 -16
  130. data/lib/action_view/helpers/tags/collection_check_boxes.rb +0 -53
  131. data/lib/action_view/helpers/tags/collection_helpers.rb +0 -84
  132. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +0 -36
  133. data/lib/action_view/helpers/tags/collection_select.rb +0 -28
  134. data/lib/action_view/helpers/tags/color_field.rb +0 -25
  135. data/lib/action_view/helpers/tags/date_field.rb +0 -13
  136. data/lib/action_view/helpers/tags/date_select.rb +0 -72
  137. data/lib/action_view/helpers/tags/datetime_field.rb +0 -22
  138. data/lib/action_view/helpers/tags/datetime_local_field.rb +0 -19
  139. data/lib/action_view/helpers/tags/datetime_select.rb +0 -8
  140. data/lib/action_view/helpers/tags/email_field.rb +0 -8
  141. data/lib/action_view/helpers/tags/file_field.rb +0 -8
  142. data/lib/action_view/helpers/tags/grouped_collection_select.rb +0 -29
  143. data/lib/action_view/helpers/tags/hidden_field.rb +0 -8
  144. data/lib/action_view/helpers/tags/label.rb +0 -65
  145. data/lib/action_view/helpers/tags/month_field.rb +0 -13
  146. data/lib/action_view/helpers/tags/number_field.rb +0 -18
  147. data/lib/action_view/helpers/tags/password_field.rb +0 -12
  148. data/lib/action_view/helpers/tags/radio_button.rb +0 -31
  149. data/lib/action_view/helpers/tags/range_field.rb +0 -8
  150. data/lib/action_view/helpers/tags/search_field.rb +0 -22
  151. data/lib/action_view/helpers/tags/select.rb +0 -40
  152. data/lib/action_view/helpers/tags/tel_field.rb +0 -8
  153. data/lib/action_view/helpers/tags/text_area.rb +0 -18
  154. data/lib/action_view/helpers/tags/text_field.rb +0 -30
  155. data/lib/action_view/helpers/tags/time_field.rb +0 -13
  156. data/lib/action_view/helpers/tags/time_select.rb +0 -8
  157. data/lib/action_view/helpers/tags/time_zone_select.rb +0 -20
  158. data/lib/action_view/helpers/tags/url_field.rb +0 -8
  159. data/lib/action_view/helpers/tags/week_field.rb +0 -13
  160. data/lib/action_view/helpers/text_helper.rb +0 -448
  161. data/lib/action_view/helpers/translation_helper.rb +0 -112
  162. data/lib/action_view/helpers/url_helper.rb +0 -635
  163. data/lib/action_view/locale/en.yml +0 -56
  164. data/lib/action_view/log_subscriber.rb +0 -30
  165. data/lib/action_view/lookup_context.rb +0 -248
  166. data/lib/action_view/model_naming.rb +0 -12
  167. data/lib/action_view/path_set.rb +0 -77
  168. data/lib/action_view/railtie.rb +0 -43
  169. data/lib/action_view/record_identifier.rb +0 -84
  170. data/lib/action_view/renderer/abstract_renderer.rb +0 -47
  171. data/lib/action_view/renderer/partial_renderer.rb +0 -500
  172. data/lib/action_view/renderer/renderer.rb +0 -50
  173. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -103
  174. data/lib/action_view/renderer/template_renderer.rb +0 -96
  175. data/lib/action_view/routing_url_for.rb +0 -107
  176. data/lib/action_view/tasks/dependencies.rake +0 -17
  177. data/lib/action_view/template.rb +0 -339
  178. data/lib/action_view/template/error.rb +0 -138
  179. data/lib/action_view/template/handlers.rb +0 -53
  180. data/lib/action_view/template/handlers/builder.rb +0 -26
  181. data/lib/action_view/template/handlers/erb.rb +0 -146
  182. data/lib/action_view/template/handlers/raw.rb +0 -11
  183. data/lib/action_view/template/resolver.rb +0 -340
  184. data/lib/action_view/template/text.rb +0 -34
  185. data/lib/action_view/template/types.rb +0 -57
  186. data/lib/action_view/test_case.rb +0 -270
  187. data/lib/action_view/testing/resolvers.rb +0 -50
  188. data/lib/action_view/vendor/html-scanner.rb +0 -20
  189. data/lib/action_view/vendor/html-scanner/html/document.rb +0 -68
  190. data/lib/action_view/vendor/html-scanner/html/node.rb +0 -532
  191. data/lib/action_view/vendor/html-scanner/html/sanitizer.rb +0 -188
  192. data/lib/action_view/vendor/html-scanner/html/selector.rb +0 -830
  193. data/lib/action_view/vendor/html-scanner/html/tokenizer.rb +0 -107
  194. data/lib/action_view/vendor/html-scanner/html/version.rb +0 -11
@@ -1,173 +0,0 @@
1
- require 'active_support/core_ext/string/output_safety'
2
- require 'set'
3
-
4
- module ActionView
5
- # = Action View Tag Helpers
6
- module Helpers #:nodoc:
7
- # Provides methods to generate HTML tags programmatically when you can't use
8
- # a Builder. By default, they output XHTML compliant tags.
9
- module TagHelper
10
- extend ActiveSupport::Concern
11
- include CaptureHelper
12
-
13
- BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
14
- autoplay controls loop selected hidden scoped async
15
- defer reversed ismap seemless muted required
16
- autofocus novalidate formnovalidate open pubdate itemscope).to_set
17
- BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attribute| attribute.to_sym })
18
-
19
- PRE_CONTENT_STRINGS = {
20
- :textarea => "\n"
21
- }
22
-
23
- # Returns an empty HTML tag of type +name+ which by default is XHTML
24
- # compliant. Set +open+ to true to create an open tag compatible
25
- # with HTML 4.0 and below. Add HTML attributes by passing an attributes
26
- # hash to +options+. Set +escape+ to false to disable attribute value
27
- # escaping.
28
- #
29
- # ==== Options
30
- # You can use symbols or strings for the attribute names.
31
- #
32
- # Use +true+ with boolean attributes that can render with no value, like
33
- # +disabled+ and +readonly+.
34
- #
35
- # HTML5 <tt>data-*</tt> attributes can be set with a single +data+ key
36
- # pointing to a hash of sub-attributes.
37
- #
38
- # To play nicely with JavaScript conventions sub-attributes are dasherized.
39
- # For example, a key +user_id+ would render as <tt>data-user-id</tt> and
40
- # thus accessed as <tt>dataset.userId</tt>.
41
- #
42
- # Values are encoded to JSON, with the exception of strings and symbols.
43
- # This may come in handy when using jQuery's HTML5-aware <tt>.data()</tt>
44
- # from 1.4.3.
45
- #
46
- # ==== Examples
47
- # tag("br")
48
- # # => <br />
49
- #
50
- # tag("br", nil, true)
51
- # # => <br>
52
- #
53
- # tag("input", type: 'text', disabled: true)
54
- # # => <input type="text" disabled="disabled" />
55
- #
56
- # tag("img", src: "open & shut.png")
57
- # # => <img src="open &amp; shut.png" />
58
- #
59
- # tag("img", {src: "open &amp; shut.png"}, false, false)
60
- # # => <img src="open &amp; shut.png" />
61
- #
62
- # tag("div", data: {name: 'Stephen', city_state: %w(Chicago IL)})
63
- # # => <div data-name="Stephen" data-city-state="[&quot;Chicago&quot;,&quot;IL&quot;]" />
64
- def tag(name, options = nil, open = false, escape = true)
65
- "<#{name}#{tag_options(options, escape) if options}#{open ? ">" : " />"}".html_safe
66
- end
67
-
68
- # Returns an HTML block tag of type +name+ surrounding the +content+. Add
69
- # HTML attributes by passing an attributes hash to +options+.
70
- # Instead of passing the content as an argument, you can also use a block
71
- # in which case, you pass your +options+ as the second parameter.
72
- # Set escape to false to disable attribute value escaping.
73
- #
74
- # ==== Options
75
- # The +options+ hash is used with attributes with no value like (<tt>disabled</tt> and
76
- # <tt>readonly</tt>), which you can give a value of true in the +options+ hash. You can use
77
- # symbols or strings for the attribute names.
78
- #
79
- # ==== Examples
80
- # content_tag(:p, "Hello world!")
81
- # # => <p>Hello world!</p>
82
- # content_tag(:div, content_tag(:p, "Hello world!"), class: "strong")
83
- # # => <div class="strong"><p>Hello world!</p></div>
84
- # content_tag("select", options, multiple: true)
85
- # # => <select multiple="multiple">...options...</select>
86
- #
87
- # <%= content_tag :div, class: "strong" do -%>
88
- # Hello world!
89
- # <% end -%>
90
- # # => <div class="strong">Hello world!</div>
91
- def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
92
- if block_given?
93
- options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
94
- content_tag_string(name, capture(&block), options, escape)
95
- else
96
- content_tag_string(name, content_or_options_with_block, options, escape)
97
- end
98
- end
99
-
100
- # Returns a CDATA section with the given +content+. CDATA sections
101
- # are used to escape blocks of text containing characters which would
102
- # otherwise be recognized as markup. CDATA sections begin with the string
103
- # <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
104
- #
105
- # cdata_section("<hello world>")
106
- # # => <![CDATA[<hello world>]]>
107
- #
108
- # cdata_section(File.read("hello_world.txt"))
109
- # # => <![CDATA[<hello from a text file]]>
110
- #
111
- # cdata_section("hello]]>world")
112
- # # => <![CDATA[hello]]]]><![CDATA[>world]]>
113
- def cdata_section(content)
114
- splitted = content.to_s.gsub(']]>', ']]]]><![CDATA[>')
115
- "<![CDATA[#{splitted}]]>".html_safe
116
- end
117
-
118
- # Returns an escaped version of +html+ without affecting existing escaped entities.
119
- #
120
- # escape_once("1 < 2 &amp; 3")
121
- # # => "1 &lt; 2 &amp; 3"
122
- #
123
- # escape_once("&lt;&lt; Accept & Checkout")
124
- # # => "&lt;&lt; Accept &amp; Checkout"
125
- def escape_once(html)
126
- ERB::Util.html_escape_once(html)
127
- end
128
-
129
- private
130
-
131
- def content_tag_string(name, content, options, escape = true)
132
- tag_options = tag_options(options, escape) if options
133
- content = ERB::Util.h(content) if escape
134
- "<#{name}#{tag_options}>#{PRE_CONTENT_STRINGS[name.to_sym]}#{content}</#{name}>".html_safe
135
- end
136
-
137
- def tag_options(options, escape = true)
138
- return if options.blank?
139
- attrs = []
140
- options.each_pair do |key, value|
141
- if key.to_s == 'data' && value.is_a?(Hash)
142
- value.each_pair do |k, v|
143
- attrs << data_tag_option(k, v, escape)
144
- end
145
- elsif BOOLEAN_ATTRIBUTES.include?(key)
146
- attrs << boolean_tag_option(key) if value
147
- elsif !value.nil?
148
- attrs << tag_option(key, value, escape)
149
- end
150
- end
151
- " #{attrs.sort * ' '}".html_safe unless attrs.empty?
152
- end
153
-
154
- def data_tag_option(key, value, escape)
155
- key = "data-#{key.to_s.dasherize}"
156
- unless value.is_a?(String) || value.is_a?(Symbol) || value.is_a?(BigDecimal)
157
- value = value.to_json
158
- end
159
- tag_option(key, value, escape)
160
- end
161
-
162
- def boolean_tag_option(key)
163
- %(#{key}="#{key}")
164
- end
165
-
166
- def tag_option(key, value, escape)
167
- value = value.join(" ") if value.is_a?(Array)
168
- value = ERB::Util.h(value) if escape
169
- %(#{key}="#{value}")
170
- end
171
- end
172
- end
173
- end
@@ -1,39 +0,0 @@
1
- module ActionView
2
- module Helpers
3
- module Tags #:nodoc:
4
- extend ActiveSupport::Autoload
5
-
6
- autoload :Base
7
- autoload :CheckBox
8
- autoload :CollectionCheckBoxes
9
- autoload :CollectionRadioButtons
10
- autoload :CollectionSelect
11
- autoload :ColorField
12
- autoload :DateField
13
- autoload :DateSelect
14
- autoload :DatetimeField
15
- autoload :DatetimeLocalField
16
- autoload :DatetimeSelect
17
- autoload :EmailField
18
- autoload :FileField
19
- autoload :GroupedCollectionSelect
20
- autoload :HiddenField
21
- autoload :Label
22
- autoload :MonthField
23
- autoload :NumberField
24
- autoload :PasswordField
25
- autoload :RadioButton
26
- autoload :RangeField
27
- autoload :SearchField
28
- autoload :Select
29
- autoload :TelField
30
- autoload :TextArea
31
- autoload :TextField
32
- autoload :TimeField
33
- autoload :TimeSelect
34
- autoload :TimeZoneSelect
35
- autoload :UrlField
36
- autoload :WeekField
37
- end
38
- end
39
- end
@@ -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.public_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,53 +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
- rendered_collection + hidden_field
31
- end
32
-
33
- private
34
-
35
- def render_component(builder)
36
- builder.check_box + builder.label
37
- end
38
-
39
- def hidden_field
40
- hidden_name = @html_options[:name]
41
-
42
- hidden_name ||= if @options.has_key?(:index)
43
- "#{tag_name_with_index(@options[:index])}[]"
44
- else
45
- "#{tag_name}[]"
46
- end
47
-
48
- @template_object.hidden_field_tag(hidden_name, "", id: nil)
49
- end
50
- end
51
- end
52
- end
53
- end