actionpack 3.2.19 → 4.0.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +850 -401
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller/asset_paths.rb +2 -2
- data/lib/abstract_controller/base.rb +39 -37
- data/lib/abstract_controller/callbacks.rb +101 -82
- data/lib/abstract_controller/collector.rb +7 -3
- data/lib/abstract_controller/helpers.rb +25 -13
- data/lib/abstract_controller/layouts.rb +74 -74
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +30 -13
- data/lib/abstract_controller/translation.rb +16 -1
- data/lib/abstract_controller/url_for.rb +6 -6
- data/lib/abstract_controller/view_paths.rb +1 -1
- data/lib/abstract_controller.rb +1 -8
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/log_subscriber.rb +16 -8
- data/lib/action_controller/metal/conditional_get.rb +76 -32
- data/lib/action_controller/metal/data_streaming.rb +20 -26
- data/lib/action_controller/metal/exceptions.rb +19 -6
- data/lib/action_controller/metal/flash.rb +24 -9
- data/lib/action_controller/metal/force_ssl.rb +70 -12
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +5 -9
- data/lib/action_controller/metal/hide_actions.rb +0 -1
- data/lib/action_controller/metal/http_authentication.rb +107 -83
- data/lib/action_controller/metal/implicit_render.rb +1 -1
- data/lib/action_controller/metal/instrumentation.rb +2 -1
- data/lib/action_controller/metal/live.rb +175 -0
- data/lib/action_controller/metal/mime_responds.rb +161 -47
- data/lib/action_controller/metal/params_wrapper.rb +112 -74
- data/lib/action_controller/metal/rack_delegation.rb +9 -3
- data/lib/action_controller/metal/redirecting.rb +15 -20
- data/lib/action_controller/metal/renderers.rb +11 -9
- data/lib/action_controller/metal/rendering.rb +9 -1
- data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
- data/lib/action_controller/metal/responder.rb +20 -19
- data/lib/action_controller/metal/streaming.rb +12 -18
- data/lib/action_controller/metal/strong_parameters.rb +520 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +28 -25
- data/lib/action_controller/metal.rb +17 -32
- data/lib/action_controller/model_naming.rb +12 -0
- data/lib/action_controller/railtie.rb +33 -17
- data/lib/action_controller/railties/helpers.rb +22 -0
- data/lib/action_controller/record_identifier.rb +18 -72
- data/lib/action_controller/test_case.rb +251 -131
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_controller.rb +15 -6
- data/lib/action_dispatch/http/cache.rb +63 -11
- data/lib/action_dispatch/http/filter_parameters.rb +18 -8
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +49 -17
- data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
- data/lib/action_dispatch/http/mime_type.rb +154 -100
- data/lib/action_dispatch/http/mime_types.rb +1 -1
- data/lib/action_dispatch/http/parameter_filter.rb +44 -46
- data/lib/action_dispatch/http/parameters.rb +28 -28
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +64 -18
- data/lib/action_dispatch/http/response.rb +130 -35
- data/lib/action_dispatch/http/upload.rb +63 -20
- data/lib/action_dispatch/http/url.rb +98 -35
- data/lib/action_dispatch/journey/backwards.rb +5 -0
- data/lib/action_dispatch/journey/formatter.rb +146 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
- data/lib/action_dispatch/journey/nodes/node.rb +124 -0
- data/lib/action_dispatch/journey/parser.rb +206 -0
- data/lib/action_dispatch/journey/parser.y +47 -0
- data/lib/action_dispatch/journey/parser_extras.rb +23 -0
- data/lib/action_dispatch/journey/path/pattern.rb +196 -0
- data/lib/action_dispatch/journey/route.rb +124 -0
- data/lib/action_dispatch/journey/router/strexp.rb +24 -0
- data/lib/action_dispatch/journey/router/utils.rb +54 -0
- data/lib/action_dispatch/journey/router.rb +166 -0
- data/lib/action_dispatch/journey/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +197 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +5 -0
- data/lib/action_dispatch/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +259 -114
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
- data/lib/action_dispatch/middleware/flash.rb +58 -58
- data/lib/action_dispatch/middleware/params_parser.rb +14 -29
- data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
- data/lib/action_dispatch/middleware/reloader.rb +6 -6
- data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
- data/lib/action_dispatch/middleware/request_id.rb +2 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
- data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
- data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
- data/lib/action_dispatch/middleware/ssl.rb +70 -0
- data/lib/action_dispatch/middleware/stack.rb +6 -1
- data/lib/action_dispatch/middleware/static.rb +2 -1
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
- data/lib/action_dispatch/railtie.rb +16 -6
- data/lib/action_dispatch/request/session.rb +181 -0
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +540 -291
- data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
- data/lib/action_dispatch/routing/redirection.rb +46 -29
- data/lib/action_dispatch/routing/route_set.rb +207 -164
- data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
- data/lib/action_dispatch/routing/url_for.rb +48 -33
- data/lib/action_dispatch/routing.rb +48 -83
- data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
- data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +65 -51
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_dispatch.rb +21 -15
- data/lib/action_pack/version.rb +7 -6
- data/lib/action_pack.rb +1 -1
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +7 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +93 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
- data/lib/action_view/helpers/asset_url_helper.rb +355 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
- data/lib/action_view/helpers/cache_helper.rb +150 -18
- data/lib/action_view/helpers/capture_helper.rb +44 -31
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +269 -248
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +931 -537
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +190 -90
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -329
- data/lib/action_view/helpers/output_safety_helper.rb +3 -3
- data/lib/action_view/helpers/record_tag_helper.rb +17 -22
- data/lib/action_view/helpers/rendering_helper.rb +2 -2
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +46 -33
- data/lib/action_view/helpers/tags/base.rb +147 -0
- data/lib/action_view/helpers/tags/check_box.rb +64 -0
- data/lib/action_view/helpers/tags/checkable.rb +16 -0
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
- data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
- data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
- data/lib/action_view/helpers/tags/collection_select.rb +28 -0
- data/lib/action_view/helpers/tags/color_field.rb +25 -0
- data/lib/action_view/helpers/tags/date_field.rb +13 -0
- data/lib/action_view/helpers/tags/date_select.rb +72 -0
- data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
- data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
- data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
- data/lib/action_view/helpers/tags/email_field.rb +8 -0
- data/lib/action_view/helpers/tags/file_field.rb +8 -0
- data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
- data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
- data/lib/action_view/helpers/tags/label.rb +65 -0
- data/lib/action_view/helpers/tags/month_field.rb +13 -0
- data/lib/action_view/helpers/tags/number_field.rb +18 -0
- data/lib/action_view/helpers/tags/password_field.rb +12 -0
- data/lib/action_view/helpers/tags/radio_button.rb +31 -0
- data/lib/action_view/helpers/tags/range_field.rb +8 -0
- data/lib/action_view/helpers/tags/search_field.rb +24 -0
- data/lib/action_view/helpers/tags/select.rb +40 -0
- data/lib/action_view/helpers/tags/tel_field.rb +8 -0
- data/lib/action_view/helpers/tags/text_area.rb +18 -0
- data/lib/action_view/helpers/tags/text_field.rb +29 -0
- data/lib/action_view/helpers/tags/time_field.rb +13 -0
- data/lib/action_view/helpers/tags/time_select.rb +8 -0
- data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
- data/lib/action_view/helpers/tags/url_field.rb +8 -0
- data/lib/action_view/helpers/tags/week_field.rb +13 -0
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/text_helper.rb +130 -114
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +211 -270
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/locale/en.yml +1 -105
- data/lib/action_view/log_subscriber.rb +6 -4
- data/lib/action_view/lookup_context.rb +15 -28
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +8 -20
- data/lib/action_view/railtie.rb +6 -22
- data/lib/action_view/record_identifier.rb +84 -0
- data/lib/action_view/renderer/abstract_renderer.rb +25 -19
- data/lib/action_view/renderer/partial_renderer.rb +158 -81
- data/lib/action_view/renderer/renderer.rb +8 -12
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +12 -10
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +40 -19
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/resolver.rb +107 -53
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/template.rb +25 -23
- data/lib/action_view/test_case.rb +67 -42
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- data/lib/action_view.rb +17 -8
- metadata +184 -214
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
data/lib/action_view/helpers.rb
CHANGED
|
@@ -6,6 +6,7 @@ module ActionView #:nodoc:
|
|
|
6
6
|
|
|
7
7
|
autoload :ActiveModelHelper
|
|
8
8
|
autoload :AssetTagHelper
|
|
9
|
+
autoload :AssetUrlHelper
|
|
9
10
|
autoload :AtomFeedHelper
|
|
10
11
|
autoload :CacheHelper
|
|
11
12
|
autoload :CaptureHelper
|
|
@@ -29,13 +30,10 @@ module ActionView #:nodoc:
|
|
|
29
30
|
|
|
30
31
|
extend ActiveSupport::Concern
|
|
31
32
|
|
|
32
|
-
included do
|
|
33
|
-
extend SanitizeHelper::ClassMethods
|
|
34
|
-
end
|
|
35
|
-
|
|
36
33
|
include ActiveSupport::Benchmarkable
|
|
37
34
|
include ActiveModelHelper
|
|
38
35
|
include AssetTagHelper
|
|
36
|
+
include AssetUrlHelper
|
|
39
37
|
include AtomFeedHelper
|
|
40
38
|
include CacheHelper
|
|
41
39
|
include CaptureHelper
|
|
@@ -1,101 +1,4 @@
|
|
|
1
1
|
"en":
|
|
2
|
-
number:
|
|
3
|
-
# Used in number_with_delimiter()
|
|
4
|
-
# These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
|
|
5
|
-
format:
|
|
6
|
-
# Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
|
|
7
|
-
separator: "."
|
|
8
|
-
# Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three)
|
|
9
|
-
delimiter: ","
|
|
10
|
-
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
|
|
11
|
-
precision: 3
|
|
12
|
-
# If set to true, precision will mean the number of significant digits instead
|
|
13
|
-
# of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
|
|
14
|
-
significant: false
|
|
15
|
-
# If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2)
|
|
16
|
-
strip_insignificant_zeros: false
|
|
17
|
-
|
|
18
|
-
# Used in number_to_currency()
|
|
19
|
-
currency:
|
|
20
|
-
format:
|
|
21
|
-
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
|
|
22
|
-
format: "%u%n"
|
|
23
|
-
unit: "$"
|
|
24
|
-
# These five are to override number.format and are optional
|
|
25
|
-
separator: "."
|
|
26
|
-
delimiter: ","
|
|
27
|
-
precision: 2
|
|
28
|
-
significant: false
|
|
29
|
-
strip_insignificant_zeros: false
|
|
30
|
-
|
|
31
|
-
# Used in number_to_percentage()
|
|
32
|
-
percentage:
|
|
33
|
-
format:
|
|
34
|
-
# These five are to override number.format and are optional
|
|
35
|
-
# separator:
|
|
36
|
-
delimiter: ""
|
|
37
|
-
# precision:
|
|
38
|
-
# significant: false
|
|
39
|
-
# strip_insignificant_zeros: false
|
|
40
|
-
|
|
41
|
-
# Used in number_to_precision()
|
|
42
|
-
precision:
|
|
43
|
-
format:
|
|
44
|
-
# These five are to override number.format and are optional
|
|
45
|
-
# separator:
|
|
46
|
-
delimiter: ""
|
|
47
|
-
# precision:
|
|
48
|
-
# significant: false
|
|
49
|
-
# strip_insignificant_zeros: false
|
|
50
|
-
|
|
51
|
-
# Used in number_to_human_size() and number_to_human()
|
|
52
|
-
human:
|
|
53
|
-
format:
|
|
54
|
-
# These five are to override number.format and are optional
|
|
55
|
-
# separator:
|
|
56
|
-
delimiter: ""
|
|
57
|
-
precision: 3
|
|
58
|
-
significant: true
|
|
59
|
-
strip_insignificant_zeros: true
|
|
60
|
-
# Used in number_to_human_size()
|
|
61
|
-
storage_units:
|
|
62
|
-
# Storage units output formatting.
|
|
63
|
-
# %u is the storage unit, %n is the number (default: 2 MB)
|
|
64
|
-
format: "%n %u"
|
|
65
|
-
units:
|
|
66
|
-
byte:
|
|
67
|
-
one: "Byte"
|
|
68
|
-
other: "Bytes"
|
|
69
|
-
kb: "KB"
|
|
70
|
-
mb: "MB"
|
|
71
|
-
gb: "GB"
|
|
72
|
-
tb: "TB"
|
|
73
|
-
# Used in number_to_human()
|
|
74
|
-
decimal_units:
|
|
75
|
-
format: "%n %u"
|
|
76
|
-
# Decimal units output formatting
|
|
77
|
-
# By default we will only quantify some of the exponents
|
|
78
|
-
# but the commented ones might be defined or overridden
|
|
79
|
-
# by the user.
|
|
80
|
-
units:
|
|
81
|
-
# femto: Quadrillionth
|
|
82
|
-
# pico: Trillionth
|
|
83
|
-
# nano: Billionth
|
|
84
|
-
# micro: Millionth
|
|
85
|
-
# mili: Thousandth
|
|
86
|
-
# centi: Hundredth
|
|
87
|
-
# deci: Tenth
|
|
88
|
-
unit: ""
|
|
89
|
-
# ten:
|
|
90
|
-
# one: Ten
|
|
91
|
-
# other: Tens
|
|
92
|
-
# hundred: Hundred
|
|
93
|
-
thousand: Thousand
|
|
94
|
-
million: Million
|
|
95
|
-
billion: Billion
|
|
96
|
-
trillion: Trillion
|
|
97
|
-
quadrillion: Quadrillion
|
|
98
|
-
|
|
99
2
|
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
|
|
100
3
|
datetime:
|
|
101
4
|
distance_in_words:
|
|
@@ -146,15 +49,8 @@
|
|
|
146
49
|
# Default value for :prompt => true in FormOptionsHelper
|
|
147
50
|
prompt: "Please select"
|
|
148
51
|
|
|
149
|
-
# Default translation keys for submit FormHelper
|
|
52
|
+
# Default translation keys for submit and button FormHelper
|
|
150
53
|
submit:
|
|
151
54
|
create: 'Create %{model}'
|
|
152
55
|
update: 'Update %{model}'
|
|
153
56
|
submit: 'Save %{model}'
|
|
154
|
-
|
|
155
|
-
# Default translation keys for button FormHelper
|
|
156
|
-
button:
|
|
157
|
-
create: 'Create %{model}'
|
|
158
|
-
update: 'Update %{model}'
|
|
159
|
-
submit: 'Save %{model}'
|
|
160
|
-
|
|
@@ -3,24 +3,26 @@ module ActionView
|
|
|
3
3
|
#
|
|
4
4
|
# Provides functionality so that Rails can output logs from Action View.
|
|
5
5
|
class LogSubscriber < ActiveSupport::LogSubscriber
|
|
6
|
+
VIEWS_PATTERN = /^app\/views\//.freeze
|
|
7
|
+
|
|
6
8
|
def render_template(event)
|
|
9
|
+
return unless logger.info?
|
|
7
10
|
message = " Rendered #{from_rails_root(event.payload[:identifier])}"
|
|
8
11
|
message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
|
|
9
|
-
message <<
|
|
12
|
+
message << " (#{event.duration.round(1)}ms)"
|
|
10
13
|
info(message)
|
|
11
14
|
end
|
|
12
15
|
alias :render_partial :render_template
|
|
13
16
|
alias :render_collection :render_template
|
|
14
17
|
|
|
15
|
-
# TODO: Ideally, ActionView should have its own logger so it does not depend on AC.logger
|
|
16
18
|
def logger
|
|
17
|
-
|
|
19
|
+
ActionView::Base.logger
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
protected
|
|
21
23
|
|
|
22
24
|
def from_rails_root(string)
|
|
23
|
-
string.sub("#{Rails.root}/", "").sub(
|
|
25
|
+
string.sub("#{Rails.root}/", "").sub(VIEWS_PATTERN, "")
|
|
24
26
|
end
|
|
25
27
|
end
|
|
26
28
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require 'active_support/core_ext/object/blank'
|
|
1
|
+
require 'thread_safe'
|
|
3
2
|
require 'active_support/core_ext/module/remove_method'
|
|
3
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
|
4
4
|
|
|
5
5
|
module ActionView
|
|
6
6
|
# = Action View Lookup Context
|
|
@@ -25,11 +25,11 @@ module ActionView
|
|
|
25
25
|
Accessors.send :define_method, :"default_#{name}", &block
|
|
26
26
|
Accessors.module_eval <<-METHOD, __FILE__, __LINE__ + 1
|
|
27
27
|
def #{name}
|
|
28
|
-
@details
|
|
28
|
+
@details.fetch(:#{name}, [])
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def #{name}=(value)
|
|
32
|
-
value = value.present? ? Array
|
|
32
|
+
value = value.present? ? Array(value) : default_#{name}
|
|
33
33
|
_set_detail(:#{name}, value) if value != @details[:#{name}]
|
|
34
34
|
end
|
|
35
35
|
|
|
@@ -51,7 +51,7 @@ module ActionView
|
|
|
51
51
|
locales.uniq!
|
|
52
52
|
locales
|
|
53
53
|
end
|
|
54
|
-
register_detail(:formats) {
|
|
54
|
+
register_detail(:formats) { ActionView::Base.default_formats || [:html, :text, :js, :css, :xml, :json] }
|
|
55
55
|
register_detail(:handlers){ Template::Handlers.extensions }
|
|
56
56
|
|
|
57
57
|
class DetailsKey #:nodoc:
|
|
@@ -59,16 +59,9 @@ module ActionView
|
|
|
59
59
|
alias :object_hash :hash
|
|
60
60
|
|
|
61
61
|
attr_reader :hash
|
|
62
|
-
@details_keys =
|
|
62
|
+
@details_keys = ThreadSafe::Cache.new
|
|
63
63
|
|
|
64
64
|
def self.get(details)
|
|
65
|
-
if details[:formats]
|
|
66
|
-
details = details.dup
|
|
67
|
-
syms = Set.new Mime::SET.symbols
|
|
68
|
-
details[:formats] = details[:formats].select { |v|
|
|
69
|
-
syms.include? v
|
|
70
|
-
}
|
|
71
|
-
end
|
|
72
65
|
@details_keys[details] ||= new
|
|
73
66
|
end
|
|
74
67
|
|
|
@@ -110,12 +103,12 @@ module ActionView
|
|
|
110
103
|
|
|
111
104
|
# Helpers related to template lookup using the lookup context information.
|
|
112
105
|
module ViewPaths
|
|
113
|
-
attr_reader :view_paths
|
|
106
|
+
attr_reader :view_paths, :html_fallback_for_js
|
|
114
107
|
|
|
115
108
|
# Whenever setting view paths, makes a copy so we can manipulate then in
|
|
116
109
|
# instance objects as we wish.
|
|
117
110
|
def view_paths=(paths)
|
|
118
|
-
@view_paths = ActionView::PathSet.new(Array
|
|
111
|
+
@view_paths = ActionView::PathSet.new(Array(paths))
|
|
119
112
|
end
|
|
120
113
|
|
|
121
114
|
def find(name, prefixes = [], partial = false, keys = [], options = {})
|
|
@@ -164,14 +157,9 @@ module ActionView
|
|
|
164
157
|
# as well as incorrectly putting part of the path in the template
|
|
165
158
|
# name instead of the prefix.
|
|
166
159
|
def normalize_name(name, prefixes) #:nodoc:
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
""
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
prefixes = nil if prefixes.blank?
|
|
174
|
-
parts = name.split('/')
|
|
160
|
+
prefixes = prefixes.presence
|
|
161
|
+
parts = name.to_s.split('/')
|
|
162
|
+
parts.shift if parts.first.empty?
|
|
175
163
|
name = parts.pop
|
|
176
164
|
|
|
177
165
|
return name, prefixes || [""] if parts.empty?
|
|
@@ -181,10 +169,6 @@ module ActionView
|
|
|
181
169
|
|
|
182
170
|
return name, prefixes
|
|
183
171
|
end
|
|
184
|
-
|
|
185
|
-
def handlers_regexp #:nodoc:
|
|
186
|
-
@@handlers_regexp ||= /\.(?:#{default_handlers.join('|')})$/
|
|
187
|
-
end
|
|
188
172
|
end
|
|
189
173
|
|
|
190
174
|
include Accessors
|
|
@@ -207,7 +191,10 @@ module ActionView
|
|
|
207
191
|
def formats=(values)
|
|
208
192
|
if values
|
|
209
193
|
values.concat(default_formats) if values.delete "*/*"
|
|
210
|
-
|
|
194
|
+
if values == [:js]
|
|
195
|
+
values << :html
|
|
196
|
+
@html_fallback_for_js = true
|
|
197
|
+
end
|
|
211
198
|
end
|
|
212
199
|
super(values)
|
|
213
200
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
module ModelNaming
|
|
3
|
+
# Converts the given object to an ActiveModel compliant one.
|
|
4
|
+
def convert_to_model(object)
|
|
5
|
+
object.respond_to?(:to_model) ? object.to_model : object
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def model_name_from_record_or_class(record_or_class)
|
|
9
|
+
(record_or_class.is_a?(Class) ? record_or_class : convert_to_model(record_or_class).class).model_name
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
data/lib/action_view/path_set.rb
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
module ActionView #:nodoc:
|
|
2
2
|
# = Action View PathSet
|
|
3
|
+
#
|
|
4
|
+
# This class is used to store and access paths in Action View. A number of
|
|
5
|
+
# operations are defined so that you can search among the paths in this
|
|
6
|
+
# set and also perform operations on other +PathSet+ objects.
|
|
7
|
+
#
|
|
8
|
+
# A +LookupContext+ will use a +PathSet+ to store the paths in its context.
|
|
3
9
|
class PathSet #:nodoc:
|
|
4
10
|
include Enumerable
|
|
5
11
|
|
|
6
12
|
attr_reader :paths
|
|
7
13
|
|
|
14
|
+
delegate :[], :include?, :pop, :size, :each, to: :paths
|
|
15
|
+
|
|
8
16
|
def initialize(paths = [])
|
|
9
17
|
@paths = typecast paths
|
|
10
18
|
end
|
|
@@ -14,30 +22,10 @@ module ActionView #:nodoc:
|
|
|
14
22
|
self
|
|
15
23
|
end
|
|
16
24
|
|
|
17
|
-
def [](i)
|
|
18
|
-
paths[i]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
25
|
def to_ary
|
|
22
26
|
paths.dup
|
|
23
27
|
end
|
|
24
28
|
|
|
25
|
-
def include?(item)
|
|
26
|
-
paths.include? item
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def pop
|
|
30
|
-
paths.pop
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def size
|
|
34
|
-
paths.size
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def each(&block)
|
|
38
|
-
paths.each(&block)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
29
|
def compact
|
|
42
30
|
PathSet.new paths.compact
|
|
43
31
|
end
|
data/lib/action_view/railtie.rb
CHANGED
|
@@ -3,11 +3,11 @@ require "rails"
|
|
|
3
3
|
|
|
4
4
|
module ActionView
|
|
5
5
|
# = Action View Railtie
|
|
6
|
-
class Railtie < Rails::Railtie
|
|
6
|
+
class Railtie < Rails::Railtie # :nodoc:
|
|
7
7
|
config.action_view = ActiveSupport::OrderedOptions.new
|
|
8
|
-
config.action_view.
|
|
9
|
-
|
|
10
|
-
config.
|
|
8
|
+
config.action_view.embed_authenticity_token_in_remote_forms = false
|
|
9
|
+
|
|
10
|
+
config.eager_load_namespaces << ActionView
|
|
11
11
|
|
|
12
12
|
initializer "action_view.embed_authenticity_token_in_remote_forms" do |app|
|
|
13
13
|
ActiveSupport.on_load(:action_view) do
|
|
@@ -16,24 +16,8 @@ module ActionView
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
initializer "action_view.
|
|
20
|
-
|
|
21
|
-
ActiveSupport.on_load(:action_view) do
|
|
22
|
-
ActionView::Helpers::AssetTagHelper::AssetPaths.cache_asset_ids = false
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
initializer "action_view.javascript_expansions" do |app|
|
|
28
|
-
ActiveSupport.on_load(:action_view) do
|
|
29
|
-
ActionView::Helpers::AssetTagHelper.register_javascript_expansion(
|
|
30
|
-
app.config.action_view.delete(:javascript_expansions)
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(
|
|
34
|
-
app.config.action_view.delete(:stylesheet_expansions)
|
|
35
|
-
)
|
|
36
|
-
end
|
|
19
|
+
initializer "action_view.logger" do
|
|
20
|
+
ActiveSupport.on_load(:action_view) { self.logger ||= Rails.logger }
|
|
37
21
|
end
|
|
38
22
|
|
|
39
23
|
initializer "action_view.set_configs" do |app|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'active_support/core_ext/module'
|
|
2
|
+
require 'action_view/model_naming'
|
|
3
|
+
|
|
4
|
+
module ActionView
|
|
5
|
+
# The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or
|
|
6
|
+
# pretty much any other model type that has an id. These patterns are then used to try elevate the view actions to
|
|
7
|
+
# a higher logical level.
|
|
8
|
+
#
|
|
9
|
+
# # routes
|
|
10
|
+
# resources :posts
|
|
11
|
+
#
|
|
12
|
+
# # view
|
|
13
|
+
# <%= div_for(post) do %> <div id="post_45" class="post">
|
|
14
|
+
# <%= post.body %> What a wonderful world!
|
|
15
|
+
# <% end %> </div>
|
|
16
|
+
#
|
|
17
|
+
# # controller
|
|
18
|
+
# def update
|
|
19
|
+
# post = Post.find(params[:id])
|
|
20
|
+
# post.update(params[:post])
|
|
21
|
+
#
|
|
22
|
+
# redirect_to(post) # Calls polymorphic_url(post) which in turn calls post_url(post)
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# As the example above shows, you can stop caring to a large extent what the actual id of the post is.
|
|
26
|
+
# You just know that one is being assigned and that the subsequent calls in redirect_to expect that
|
|
27
|
+
# same naming convention and allows you to write less code if you follow it.
|
|
28
|
+
module RecordIdentifier
|
|
29
|
+
extend self
|
|
30
|
+
extend ModelNaming
|
|
31
|
+
|
|
32
|
+
include ModelNaming
|
|
33
|
+
|
|
34
|
+
JOIN = '_'.freeze
|
|
35
|
+
NEW = 'new'.freeze
|
|
36
|
+
|
|
37
|
+
# The DOM class convention is to use the singular form of an object or class.
|
|
38
|
+
#
|
|
39
|
+
# dom_class(post) # => "post"
|
|
40
|
+
# dom_class(Person) # => "person"
|
|
41
|
+
#
|
|
42
|
+
# If you need to address multiple instances of the same class in the same view, you can prefix the dom_class:
|
|
43
|
+
#
|
|
44
|
+
# dom_class(post, :edit) # => "edit_post"
|
|
45
|
+
# dom_class(Person, :edit) # => "edit_person"
|
|
46
|
+
def dom_class(record_or_class, prefix = nil)
|
|
47
|
+
singular = model_name_from_record_or_class(record_or_class).param_key
|
|
48
|
+
prefix ? "#{prefix}#{JOIN}#{singular}" : singular
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# The DOM id convention is to use the singular form of an object or class with the id following an underscore.
|
|
52
|
+
# If no id is found, prefix with "new_" instead.
|
|
53
|
+
#
|
|
54
|
+
# dom_id(Post.find(45)) # => "post_45"
|
|
55
|
+
# dom_id(Post.new) # => "new_post"
|
|
56
|
+
#
|
|
57
|
+
# If you need to address multiple instances of the same class in the same view, you can prefix the dom_id:
|
|
58
|
+
#
|
|
59
|
+
# dom_id(Post.find(45), :edit) # => "edit_post_45"
|
|
60
|
+
# dom_id(Post.new, :custom) # => "custom_post"
|
|
61
|
+
def dom_id(record, prefix = nil)
|
|
62
|
+
if record_id = record_key_for_dom_id(record)
|
|
63
|
+
"#{dom_class(record, prefix)}#{JOIN}#{record_id}"
|
|
64
|
+
else
|
|
65
|
+
dom_class(record, prefix || NEW)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
protected
|
|
70
|
+
|
|
71
|
+
# Returns a string representation of the key attribute(s) that is suitable for use in an HTML DOM id.
|
|
72
|
+
# This can be overwritten to customize the default generated string representation if desired.
|
|
73
|
+
# If you need to read back a key from a dom_id in order to query for the underlying database record,
|
|
74
|
+
# you should write a helper like 'person_record_from_dom_id' that will extract the key either based
|
|
75
|
+
# on the default implementation (which just joins all key attributes with '_') or on your own
|
|
76
|
+
# overwritten version of the method. By default, this implementation passes the key string through a
|
|
77
|
+
# method that replaces all characters that are invalid inside DOM ids, with valid ones. You need to
|
|
78
|
+
# make sure yourself that your dom ids are valid, in case you overwrite this method.
|
|
79
|
+
def record_key_for_dom_id(record)
|
|
80
|
+
key = convert_to_model(record).to_key
|
|
81
|
+
key ? key.join('_') : key
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
module ActionView
|
|
2
|
+
# This class defines the interface for a renderer. Each class that
|
|
3
|
+
# subclasses +AbstractRenderer+ is used by the base +Renderer+ class to
|
|
4
|
+
# render a specific type of object.
|
|
5
|
+
#
|
|
6
|
+
# The base +Renderer+ class uses its +render+ method to delegate to the
|
|
7
|
+
# renderers. These currently consist of
|
|
8
|
+
#
|
|
9
|
+
# PartialRenderer - Used for rendering partials
|
|
10
|
+
# TemplateRenderer - Used for rendering other types of templates
|
|
11
|
+
# StreamingTemplateRenderer - Used for streaming
|
|
12
|
+
#
|
|
13
|
+
# Whenever the +render+ method is called on the base +Renderer+ class, a new
|
|
14
|
+
# renderer object of the correct type is created, and the +render+ method on
|
|
15
|
+
# that new object is called in turn. This abstracts the setup and rendering
|
|
16
|
+
# into a separate classes for partials and templates.
|
|
2
17
|
class AbstractRenderer #:nodoc:
|
|
3
|
-
delegate :find_template, :template_exists?, :with_fallbacks, :
|
|
4
|
-
:with_layout_format, :formats, :to => :@lookup_context
|
|
18
|
+
delegate :find_template, :template_exists?, :with_fallbacks, :with_layout_format, :formats, :to => :@lookup_context
|
|
5
19
|
|
|
6
20
|
def initialize(lookup_context)
|
|
7
21
|
@lookup_context = lookup_context
|
|
@@ -12,30 +26,22 @@ module ActionView
|
|
|
12
26
|
end
|
|
13
27
|
|
|
14
28
|
protected
|
|
15
|
-
|
|
29
|
+
|
|
16
30
|
def extract_details(options)
|
|
17
|
-
|
|
18
|
-
@lookup_context.registered_details.each do |key|
|
|
31
|
+
@lookup_context.registered_details.each_with_object({}) do |key, details|
|
|
19
32
|
next unless value = options[key]
|
|
20
|
-
details[key] = Array
|
|
21
|
-
end
|
|
22
|
-
details
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def extract_format(value, details)
|
|
26
|
-
if value.is_a?(String) && value.sub!(formats_regexp, "")
|
|
27
|
-
ActiveSupport::Deprecation.warn "Passing the format in the template name is deprecated. " \
|
|
28
|
-
"Please pass render with :formats => [:#{$1}] instead.", caller
|
|
29
|
-
details[:formats] ||= [$1.to_sym]
|
|
33
|
+
details[key] = Array(value)
|
|
30
34
|
end
|
|
31
35
|
end
|
|
32
36
|
|
|
33
|
-
def formats_regexp
|
|
34
|
-
@@formats_regexp ||= /\.(#{Mime::SET.symbols.join('|')})$/
|
|
35
|
-
end
|
|
36
|
-
|
|
37
37
|
def instrument(name, options={})
|
|
38
38
|
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
|
|
39
39
|
end
|
|
40
|
+
|
|
41
|
+
def prepend_formats(formats)
|
|
42
|
+
formats = Array(formats)
|
|
43
|
+
return if formats.empty? || @lookup_context.html_fallback_for_js
|
|
44
|
+
@lookup_context.formats = formats | @lookup_context.formats
|
|
45
|
+
end
|
|
40
46
|
end
|
|
41
47
|
end
|