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
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
require 'active_support/testing/performance'
|
|
2
|
-
|
|
3
|
-
module ActionDispatch
|
|
4
|
-
# An integration test that runs a code profiler on your test methods.
|
|
5
|
-
# Profiling output for combinations of each test method, measurement, and
|
|
6
|
-
# output format are written to your tmp/performance directory.
|
|
7
|
-
class PerformanceTest < ActionDispatch::IntegrationTest
|
|
8
|
-
include ActiveSupport::Testing::Performance
|
|
9
|
-
end
|
|
10
|
-
end
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
require 'zlib'
|
|
2
|
-
require 'active_support/core_ext/file'
|
|
3
|
-
require 'action_controller/metal/exceptions'
|
|
4
|
-
|
|
5
|
-
module ActionView
|
|
6
|
-
class AssetPaths #:nodoc:
|
|
7
|
-
attr_reader :config, :controller
|
|
8
|
-
|
|
9
|
-
def initialize(config, controller = nil)
|
|
10
|
-
@config = config
|
|
11
|
-
@controller = controller
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Add the extension +ext+ if not present. Return full or scheme-relative URLs otherwise untouched.
|
|
15
|
-
# Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL
|
|
16
|
-
# roots. Rewrite the asset path for cache-busting asset ids. Include
|
|
17
|
-
# asset host, if configured, with the correct request protocol.
|
|
18
|
-
#
|
|
19
|
-
# When :relative (default), the protocol will be determined by the client using current protocol
|
|
20
|
-
# When :request, the protocol will be the request protocol
|
|
21
|
-
# Otherwise, the protocol is used (E.g. :http, :https, etc)
|
|
22
|
-
def compute_public_path(source, dir, options = {})
|
|
23
|
-
source = source.to_s
|
|
24
|
-
return source if is_uri?(source)
|
|
25
|
-
|
|
26
|
-
source = rewrite_extension(source, dir, options[:ext]) if options[:ext]
|
|
27
|
-
source = rewrite_asset_path(source, dir, options)
|
|
28
|
-
source = rewrite_relative_url_root(source, relative_url_root)
|
|
29
|
-
source = rewrite_host_and_protocol(source, options[:protocol])
|
|
30
|
-
source
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Return the filesystem path for the source
|
|
34
|
-
def compute_source_path(source, dir, ext)
|
|
35
|
-
source = rewrite_extension(source, dir, ext) if ext
|
|
36
|
-
|
|
37
|
-
sources = []
|
|
38
|
-
sources << config.assets_dir
|
|
39
|
-
sources << dir unless source[0] == ?/
|
|
40
|
-
sources << source
|
|
41
|
-
|
|
42
|
-
File.join(sources)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def is_uri?(path)
|
|
46
|
-
path =~ %r{^[-a-z]+://|^(?:cid|data):|^//}i
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
private
|
|
50
|
-
|
|
51
|
-
def rewrite_extension(source, dir, ext)
|
|
52
|
-
raise NotImplementedError
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def rewrite_asset_path(source, path = nil)
|
|
56
|
-
raise NotImplementedError
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def rewrite_relative_url_root(source, relative_url_root)
|
|
60
|
-
relative_url_root && !source.starts_with?("#{relative_url_root}/") ? "#{relative_url_root}#{source}" : source
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def has_request?
|
|
64
|
-
controller.respond_to?(:request)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def rewrite_host_and_protocol(source, protocol = nil)
|
|
68
|
-
host = compute_asset_host(source)
|
|
69
|
-
if host && !is_uri?(host)
|
|
70
|
-
if (protocol || default_protocol) == :request && !has_request?
|
|
71
|
-
host = nil
|
|
72
|
-
else
|
|
73
|
-
host = "#{compute_protocol(protocol)}#{host}"
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
host ? "#{host}#{source}" : source
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def compute_protocol(protocol)
|
|
80
|
-
protocol ||= default_protocol
|
|
81
|
-
case protocol
|
|
82
|
-
when :relative
|
|
83
|
-
"//"
|
|
84
|
-
when :request
|
|
85
|
-
unless @controller
|
|
86
|
-
invalid_asset_host!("The protocol requested was :request. Consider using :relative instead.")
|
|
87
|
-
end
|
|
88
|
-
@controller.request.protocol
|
|
89
|
-
else
|
|
90
|
-
"#{protocol}://"
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def default_protocol
|
|
95
|
-
@config.default_asset_host_protocol || (has_request? ? :request : :relative)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def invalid_asset_host!(help_message)
|
|
99
|
-
raise ActionController::RoutingError, "This asset host cannot be computed without a request in scope. #{help_message}"
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Pick an asset host for this source. Returns +nil+ if no host is set,
|
|
103
|
-
# the host if no wildcard is set, the host interpolated with the
|
|
104
|
-
# numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
|
|
105
|
-
# or the value returned from invoking call on an object responding to call
|
|
106
|
-
# (proc or otherwise).
|
|
107
|
-
def compute_asset_host(source)
|
|
108
|
-
if host = asset_host_config
|
|
109
|
-
if host.respond_to?(:call)
|
|
110
|
-
args = [source]
|
|
111
|
-
arity = arity_of(host)
|
|
112
|
-
if (arity > 1 || arity < -2) && !has_request?
|
|
113
|
-
invalid_asset_host!("Remove the second argument to your asset_host Proc if you do not need the request, or make it optional.")
|
|
114
|
-
end
|
|
115
|
-
args << current_request if (arity > 1 || arity < 0) && has_request?
|
|
116
|
-
host.call(*args)
|
|
117
|
-
else
|
|
118
|
-
(host =~ /%d/) ? host % (Zlib.crc32(source) % 4) : host
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def relative_url_root
|
|
124
|
-
config.relative_url_root
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def asset_host_config
|
|
128
|
-
config.asset_host
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
# Returns the current request if one exists.
|
|
132
|
-
def current_request
|
|
133
|
-
controller.request if has_request?
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
# Returns the arity of a callable
|
|
137
|
-
def arity_of(callable)
|
|
138
|
-
callable.respond_to?(:arity) ? callable.arity : callable.method(:call).arity
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
end
|
|
142
|
-
end
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
require 'active_support/core_ext/class/attribute'
|
|
2
|
-
require 'active_support/core_ext/string/inflections'
|
|
3
|
-
require 'active_support/core_ext/file'
|
|
4
|
-
require 'action_view/helpers/tag_helper'
|
|
5
|
-
|
|
6
|
-
module ActionView
|
|
7
|
-
module Helpers
|
|
8
|
-
module AssetTagHelper
|
|
9
|
-
|
|
10
|
-
class AssetIncludeTag
|
|
11
|
-
include TagHelper
|
|
12
|
-
|
|
13
|
-
attr_reader :config, :asset_paths
|
|
14
|
-
class_attribute :expansions
|
|
15
|
-
|
|
16
|
-
def self.inherited(base)
|
|
17
|
-
base.expansions = { }
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def initialize(config, asset_paths)
|
|
21
|
-
@config = config
|
|
22
|
-
@asset_paths = asset_paths
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def asset_name
|
|
26
|
-
raise NotImplementedError
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def extension
|
|
30
|
-
raise NotImplementedError
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def custom_dir
|
|
34
|
-
raise NotImplementedError
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def asset_tag(source, options)
|
|
38
|
-
raise NotImplementedError
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def include_tag(*sources)
|
|
42
|
-
options = sources.extract_options!.stringify_keys
|
|
43
|
-
concat = options.delete("concat")
|
|
44
|
-
cache = concat || options.delete("cache")
|
|
45
|
-
recursive = options.delete("recursive")
|
|
46
|
-
|
|
47
|
-
if concat || (config.perform_caching && cache)
|
|
48
|
-
joined_name = (cache == true ? "all" : cache) + ".#{extension}"
|
|
49
|
-
joined_path = File.join((joined_name[/^#{File::SEPARATOR}/] ? config.assets_dir : custom_dir), joined_name)
|
|
50
|
-
unless config.perform_caching && File.exists?(joined_path)
|
|
51
|
-
write_asset_file_contents(joined_path, compute_paths(sources, recursive))
|
|
52
|
-
end
|
|
53
|
-
asset_tag(joined_name, options)
|
|
54
|
-
else
|
|
55
|
-
sources = expand_sources(sources, recursive)
|
|
56
|
-
ensure_sources!(sources) if cache
|
|
57
|
-
sources.collect { |source| asset_tag(source, options) }.join("\n").html_safe
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
private
|
|
62
|
-
|
|
63
|
-
def path_to_asset(source, options = {})
|
|
64
|
-
asset_paths.compute_public_path(source, asset_name.to_s.pluralize, options.merge(:ext => extension))
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def path_to_asset_source(source)
|
|
68
|
-
asset_paths.compute_source_path(source, asset_name.to_s.pluralize, extension)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def compute_paths(*args)
|
|
72
|
-
expand_sources(*args).collect { |source| path_to_asset_source(source) }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def expand_sources(sources, recursive)
|
|
76
|
-
if sources.first == :all
|
|
77
|
-
collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}")
|
|
78
|
-
else
|
|
79
|
-
sources.inject([]) do |list, source|
|
|
80
|
-
determined_source = determine_source(source, expansions)
|
|
81
|
-
update_source_list(list, determined_source)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def update_source_list(list, source)
|
|
87
|
-
case source
|
|
88
|
-
when String
|
|
89
|
-
list.delete(source)
|
|
90
|
-
list << source
|
|
91
|
-
when Array
|
|
92
|
-
updated_sources = source - list
|
|
93
|
-
list.concat(updated_sources)
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def ensure_sources!(sources)
|
|
98
|
-
sources.each do |source|
|
|
99
|
-
asset_file_path!(path_to_asset_source(source))
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def collect_asset_files(*path)
|
|
104
|
-
dir = path.first
|
|
105
|
-
|
|
106
|
-
Dir[File.join(*path.compact)].collect do |file|
|
|
107
|
-
file[-(file.size - dir.size - 1)..-1].sub(/\.\w+$/, '')
|
|
108
|
-
end.sort
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def determine_source(source, collection)
|
|
112
|
-
case source
|
|
113
|
-
when Symbol
|
|
114
|
-
collection[source] || raise(ArgumentError, "No expansion found for #{source.inspect}")
|
|
115
|
-
else
|
|
116
|
-
source
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def join_asset_file_contents(paths)
|
|
121
|
-
paths.collect { |path| File.read(asset_file_path!(path, true)) }.join("\n\n")
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
def write_asset_file_contents(joined_asset_path, asset_paths)
|
|
125
|
-
FileUtils.mkdir_p(File.dirname(joined_asset_path))
|
|
126
|
-
File.atomic_write(joined_asset_path) { |cache| cache.write(join_asset_file_contents(asset_paths)) }
|
|
127
|
-
|
|
128
|
-
# Set mtime to the latest of the combined files to allow for
|
|
129
|
-
# consistent ETag without a shared filesystem.
|
|
130
|
-
mt = asset_paths.map { |p| File.mtime(asset_file_path!(p)) }.max
|
|
131
|
-
File.utime(mt, mt, joined_asset_path)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def asset_file_path!(absolute_path, error_if_file_is_uri = false)
|
|
135
|
-
if asset_paths.is_uri?(absolute_path)
|
|
136
|
-
raise(Errno::ENOENT, "Asset file #{path} is uri and cannot be merged into single file") if error_if_file_is_uri
|
|
137
|
-
else
|
|
138
|
-
raise(Errno::ENOENT, "Asset file not found at '#{absolute_path}'" ) unless File.exist?(absolute_path)
|
|
139
|
-
return absolute_path
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
require 'thread'
|
|
2
|
-
require 'active_support/core_ext/file'
|
|
3
|
-
require 'active_support/core_ext/module/attribute_accessors'
|
|
4
|
-
|
|
5
|
-
module ActionView
|
|
6
|
-
module Helpers
|
|
7
|
-
module AssetTagHelper
|
|
8
|
-
|
|
9
|
-
class AssetPaths < ::ActionView::AssetPaths #:nodoc:
|
|
10
|
-
# You can enable or disable the asset tag ids cache.
|
|
11
|
-
# With the cache enabled, the asset tag helper methods will make fewer
|
|
12
|
-
# expensive file system calls (the default implementation checks the file
|
|
13
|
-
# system timestamp). However this prevents you from modifying any asset
|
|
14
|
-
# files while the server is running.
|
|
15
|
-
#
|
|
16
|
-
# ActionView::Helpers::AssetTagHelper::AssetPaths.cache_asset_ids = false
|
|
17
|
-
mattr_accessor :cache_asset_ids
|
|
18
|
-
|
|
19
|
-
# Add or change an asset id in the asset id cache. This can be used
|
|
20
|
-
# for SASS on Heroku.
|
|
21
|
-
# :api: public
|
|
22
|
-
def add_to_asset_ids_cache(source, asset_id)
|
|
23
|
-
self.asset_ids_cache_guard.synchronize do
|
|
24
|
-
self.asset_ids_cache[source] = asset_id
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
private
|
|
29
|
-
|
|
30
|
-
def rewrite_extension(source, dir, ext)
|
|
31
|
-
source_ext = File.extname(source)
|
|
32
|
-
|
|
33
|
-
source_with_ext = if source_ext.empty?
|
|
34
|
-
"#{source}.#{ext}"
|
|
35
|
-
elsif ext != source_ext[1..-1]
|
|
36
|
-
with_ext = "#{source}.#{ext}"
|
|
37
|
-
with_ext if File.exist?(File.join(config.assets_dir, dir, with_ext))
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
source_with_ext || source
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Break out the asset path rewrite in case plugins wish to put the asset id
|
|
44
|
-
# someplace other than the query string.
|
|
45
|
-
def rewrite_asset_path(source, dir, options = nil)
|
|
46
|
-
source = "/#{dir}/#{source}" unless source[0] == ?/
|
|
47
|
-
path = config.asset_path
|
|
48
|
-
|
|
49
|
-
if path && path.respond_to?(:call)
|
|
50
|
-
return path.call(source)
|
|
51
|
-
elsif path && path.is_a?(String)
|
|
52
|
-
return path % [source]
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
asset_id = rails_asset_id(source)
|
|
56
|
-
if asset_id.empty?
|
|
57
|
-
source
|
|
58
|
-
else
|
|
59
|
-
"#{source}?#{asset_id}"
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
mattr_accessor :asset_ids_cache
|
|
64
|
-
self.asset_ids_cache = {}
|
|
65
|
-
|
|
66
|
-
mattr_accessor :asset_ids_cache_guard
|
|
67
|
-
self.asset_ids_cache_guard = Mutex.new
|
|
68
|
-
|
|
69
|
-
# Use the RAILS_ASSET_ID environment variable or the source's
|
|
70
|
-
# modification time as its cache-busting asset id.
|
|
71
|
-
def rails_asset_id(source)
|
|
72
|
-
if asset_id = ENV["RAILS_ASSET_ID"]
|
|
73
|
-
asset_id
|
|
74
|
-
else
|
|
75
|
-
if self.cache_asset_ids && (asset_id = self.asset_ids_cache[source])
|
|
76
|
-
asset_id
|
|
77
|
-
else
|
|
78
|
-
path = File.join(config.assets_dir, source)
|
|
79
|
-
asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : ''
|
|
80
|
-
|
|
81
|
-
if self.cache_asset_ids
|
|
82
|
-
add_to_asset_ids_cache(source, asset_id)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
asset_id
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
require 'active_support/concern'
|
|
2
|
-
require 'active_support/core_ext/file'
|
|
3
|
-
require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
|
|
4
|
-
|
|
5
|
-
module ActionView
|
|
6
|
-
module Helpers
|
|
7
|
-
module AssetTagHelper
|
|
8
|
-
|
|
9
|
-
class JavascriptIncludeTag < AssetIncludeTag
|
|
10
|
-
def asset_name
|
|
11
|
-
'javascript'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def extension
|
|
15
|
-
'js'
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def asset_tag(source, options)
|
|
19
|
-
content_tag("script", "", { "type" => Mime::JS, "src" => path_to_asset(source) }.merge(options))
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def custom_dir
|
|
23
|
-
config.javascripts_dir
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def expand_sources(sources, recursive = false)
|
|
29
|
-
if sources.include?(:all)
|
|
30
|
-
all_asset_files = (collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}") - ['application'])
|
|
31
|
-
add_application_js(all_asset_files, sources)
|
|
32
|
-
((determine_source(:defaults, expansions).dup & all_asset_files) + all_asset_files).uniq
|
|
33
|
-
else
|
|
34
|
-
expanded_sources = sources.inject([]) do |list, source|
|
|
35
|
-
determined_source = determine_source(source, expansions)
|
|
36
|
-
update_source_list(list, determined_source)
|
|
37
|
-
end
|
|
38
|
-
add_application_js(expanded_sources, sources)
|
|
39
|
-
expanded_sources
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def add_application_js(expanded_sources, sources)
|
|
44
|
-
if (sources.include?(:defaults) || sources.include?(:all)) && File.exist?(File.join(custom_dir, "application.#{extension}"))
|
|
45
|
-
expanded_sources.delete('application')
|
|
46
|
-
expanded_sources << "application"
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
module JavascriptTagHelpers
|
|
53
|
-
extend ActiveSupport::Concern
|
|
54
|
-
|
|
55
|
-
module ClassMethods
|
|
56
|
-
# Register one or more javascript files to be included when <tt>symbol</tt>
|
|
57
|
-
# is passed to <tt>javascript_include_tag</tt>. This method is typically intended
|
|
58
|
-
# to be called from plugin initialization to register javascript files
|
|
59
|
-
# that the plugin installed in <tt>public/javascripts</tt>.
|
|
60
|
-
#
|
|
61
|
-
# ActionView::Helpers::AssetTagHelper.register_javascript_expansion :monkey => ["head", "body", "tail"]
|
|
62
|
-
#
|
|
63
|
-
# javascript_include_tag :monkey # =>
|
|
64
|
-
# <script type="text/javascript" src="/javascripts/head.js"></script>
|
|
65
|
-
# <script type="text/javascript" src="/javascripts/body.js"></script>
|
|
66
|
-
# <script type="text/javascript" src="/javascripts/tail.js"></script>
|
|
67
|
-
def register_javascript_expansion(expansions)
|
|
68
|
-
js_expansions = JavascriptIncludeTag.expansions
|
|
69
|
-
expansions.each do |key, values|
|
|
70
|
-
js_expansions[key] = (js_expansions[key] || []) | Array(values)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# Computes the path to a javascript asset in the public javascripts directory.
|
|
76
|
-
# If the +source+ filename has no extension, .js will be appended (except for explicit URIs)
|
|
77
|
-
# Full paths from the document root will be passed through.
|
|
78
|
-
# Used internally by javascript_include_tag to build the script path.
|
|
79
|
-
#
|
|
80
|
-
# ==== Examples
|
|
81
|
-
# javascript_path "xmlhr" # => /javascripts/xmlhr.js
|
|
82
|
-
# javascript_path "dir/xmlhr.js" # => /javascripts/dir/xmlhr.js
|
|
83
|
-
# javascript_path "/dir/xmlhr" # => /dir/xmlhr.js
|
|
84
|
-
# javascript_path "http://www.example.com/js/xmlhr" # => http://www.example.com/js/xmlhr
|
|
85
|
-
# javascript_path "http://www.example.com/js/xmlhr.js" # => http://www.example.com/js/xmlhr.js
|
|
86
|
-
def javascript_path(source)
|
|
87
|
-
asset_paths.compute_public_path(source, 'javascripts', :ext => 'js')
|
|
88
|
-
end
|
|
89
|
-
alias_method :path_to_javascript, :javascript_path # aliased to avoid conflicts with a javascript_path named route
|
|
90
|
-
|
|
91
|
-
# Returns an HTML script tag for each of the +sources+ provided.
|
|
92
|
-
#
|
|
93
|
-
# Sources may be paths to JavaScript files. Relative paths are assumed to be relative
|
|
94
|
-
# to <tt>public/javascripts</tt>, full paths are assumed to be relative to the document
|
|
95
|
-
# root. Relative paths are idiomatic, use absolute paths only when needed.
|
|
96
|
-
#
|
|
97
|
-
# When passing paths, the ".js" extension is optional.
|
|
98
|
-
#
|
|
99
|
-
# If the application is not using the asset pipeline, to include the default JavaScript
|
|
100
|
-
# expansion pass <tt>:defaults</tt> as source. By default, <tt>:defaults</tt> loads jQuery,
|
|
101
|
-
# and that can be overridden in <tt>config/application.rb</tt>:
|
|
102
|
-
#
|
|
103
|
-
# config.action_view.javascript_expansions[:defaults] = %w(foo.js bar.js)
|
|
104
|
-
#
|
|
105
|
-
# When using <tt>:defaults</tt> or <tt>:all</tt>, if an <tt>application.js</tt> file exists
|
|
106
|
-
# in <tt>public/javascripts</tt> it will be included as well at the end.
|
|
107
|
-
#
|
|
108
|
-
# You can modify the HTML attributes of the script tag by passing a hash as the
|
|
109
|
-
# last argument.
|
|
110
|
-
#
|
|
111
|
-
# ==== Examples
|
|
112
|
-
# javascript_include_tag "xmlhr"
|
|
113
|
-
# # => <script type="text/javascript" src="/javascripts/xmlhr.js?1284139606"></script>
|
|
114
|
-
#
|
|
115
|
-
# javascript_include_tag "xmlhr.js"
|
|
116
|
-
# # => <script type="text/javascript" src="/javascripts/xmlhr.js?1284139606"></script>
|
|
117
|
-
#
|
|
118
|
-
# javascript_include_tag "common.javascript", "/elsewhere/cools"
|
|
119
|
-
# # => <script type="text/javascript" src="/javascripts/common.javascript?1284139606"></script>
|
|
120
|
-
# # <script type="text/javascript" src="/elsewhere/cools.js?1423139606"></script>
|
|
121
|
-
#
|
|
122
|
-
# javascript_include_tag "http://www.example.com/xmlhr"
|
|
123
|
-
# # => <script type="text/javascript" src="http://www.example.com/xmlhr"></script>
|
|
124
|
-
#
|
|
125
|
-
# javascript_include_tag "http://www.example.com/xmlhr.js"
|
|
126
|
-
# # => <script type="text/javascript" src="http://www.example.com/xmlhr.js"></script>
|
|
127
|
-
#
|
|
128
|
-
# javascript_include_tag :defaults
|
|
129
|
-
# # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
|
|
130
|
-
# # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
|
|
131
|
-
# # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
|
|
132
|
-
#
|
|
133
|
-
# Note: The application.js file is only referenced if it exists
|
|
134
|
-
#
|
|
135
|
-
# You can also include all JavaScripts in the +javascripts+ directory using <tt>:all</tt> as the source:
|
|
136
|
-
#
|
|
137
|
-
# javascript_include_tag :all
|
|
138
|
-
# # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
|
|
139
|
-
# # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
|
|
140
|
-
# # <script type="text/javascript" src="/javascripts/shop.js?1284139606"></script>
|
|
141
|
-
# # <script type="text/javascript" src="/javascripts/checkout.js?1284139606"></script>
|
|
142
|
-
# # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
|
|
143
|
-
#
|
|
144
|
-
# Note that your defaults of choice will be included first, so they will be available to all subsequently
|
|
145
|
-
# included files.
|
|
146
|
-
#
|
|
147
|
-
# If you want Rails to search in all the subdirectories under <tt>public/javascripts</tt>, you should
|
|
148
|
-
# explicitly set <tt>:recursive</tt>:
|
|
149
|
-
#
|
|
150
|
-
# javascript_include_tag :all, :recursive => true
|
|
151
|
-
#
|
|
152
|
-
# == Caching multiple JavaScripts into one
|
|
153
|
-
#
|
|
154
|
-
# You can also cache multiple JavaScripts into one file, which requires less HTTP connections to download
|
|
155
|
-
# and can better be compressed by gzip (leading to faster transfers). Caching will only happen if
|
|
156
|
-
# <tt>config.perform_caching</tt> is set to true (which is the case by default for the Rails
|
|
157
|
-
# production environment, but not for the development environment).
|
|
158
|
-
#
|
|
159
|
-
# ==== Examples
|
|
160
|
-
#
|
|
161
|
-
# # assuming config.perform_caching is false
|
|
162
|
-
# javascript_include_tag :all, :cache => true
|
|
163
|
-
# # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
|
|
164
|
-
# # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
|
|
165
|
-
# # <script type="text/javascript" src="/javascripts/shop.js?1284139606"></script>
|
|
166
|
-
# # <script type="text/javascript" src="/javascripts/checkout.js?1284139606"></script>
|
|
167
|
-
# # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
|
|
168
|
-
#
|
|
169
|
-
# # assuming config.perform_caching is true
|
|
170
|
-
# javascript_include_tag :all, :cache => true
|
|
171
|
-
# # => <script type="text/javascript" src="/javascripts/all.js?1344139789"></script>
|
|
172
|
-
#
|
|
173
|
-
# # assuming config.perform_caching is false
|
|
174
|
-
# javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
|
|
175
|
-
# # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
|
|
176
|
-
# # <script type="text/javascript" src="/javascripts/cart.js?1289139157"></script>
|
|
177
|
-
# # <script type="text/javascript" src="/javascripts/checkout.js?1299139816"></script>
|
|
178
|
-
#
|
|
179
|
-
# # assuming config.perform_caching is true
|
|
180
|
-
# javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
|
|
181
|
-
# # => <script type="text/javascript" src="/javascripts/shop.js?1299139816"></script>
|
|
182
|
-
#
|
|
183
|
-
# The <tt>:recursive</tt> option is also available for caching:
|
|
184
|
-
#
|
|
185
|
-
# javascript_include_tag :all, :cache => true, :recursive => true
|
|
186
|
-
def javascript_include_tag(*sources)
|
|
187
|
-
@javascript_include ||= JavascriptIncludeTag.new(config, asset_paths)
|
|
188
|
-
@javascript_include.include_tag(*sources)
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
end
|
|
193
|
-
end
|