actionpack 3.2.22.5 → 4.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +641 -418
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -288
- data/lib/abstract_controller.rb +1 -8
- 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 +23 -11
- data/lib/abstract_controller/layouts.rb +68 -73
- data/lib/abstract_controller/logger.rb +1 -2
- data/lib/abstract_controller/rendering.rb +22 -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/action_controller.rb +15 -6
- data/lib/action_controller/base.rb +46 -22
- data/lib/action_controller/caching.rb +46 -33
- data/lib/action_controller/caching/fragments.rb +23 -53
- data/lib/action_controller/deprecated.rb +5 -1
- data/lib/action_controller/deprecated/integration_test.rb +3 -0
- data/lib/action_controller/log_subscriber.rb +11 -8
- data/lib/action_controller/metal.rb +16 -30
- 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 +32 -9
- data/lib/action_controller/metal/head.rb +25 -4
- data/lib/action_controller/metal/helpers.rb +6 -9
- data/lib/action_controller/metal/hide_actions.rb +1 -2
- data/lib/action_controller/metal/http_authentication.rb +105 -87
- 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 +141 -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 +8 -0
- 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 +516 -0
- data/lib/action_controller/metal/testing.rb +13 -18
- data/lib/action_controller/metal/url_for.rb +27 -25
- 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 +215 -123
- data/lib/action_controller/vendor/html-scanner.rb +4 -19
- data/lib/action_dispatch.rb +27 -19
- 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 +27 -19
- data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
- data/lib/action_dispatch/http/mime_type.rb +145 -113
- 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 +12 -5
- data/lib/action_dispatch/http/rack_cache.rb +2 -3
- data/lib/action_dispatch/http/request.rb +49 -18
- data/lib/action_dispatch/http/response.rb +129 -35
- data/lib/action_dispatch/http/upload.rb +60 -17
- data/lib/action_dispatch/http/url.rb +53 -31
- data/lib/action_dispatch/journey.rb +5 -0
- 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 +116 -0
- data/lib/action_dispatch/journey/router.rb +164 -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/routes.rb +75 -0
- data/lib/action_dispatch/journey/scanner.rb +61 -0
- data/lib/action_dispatch/journey/visitors.rb +189 -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/middleware/callbacks.rb +9 -4
- data/lib/action_dispatch/middleware/cookies.rb +168 -57
- data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
- data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -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 +31 -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/cache_store.rb +3 -3
- data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
- 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 +5 -24
- 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 +3 -3
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -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.rb +41 -40
- data/lib/action_dispatch/routing/inspector.rb +240 -0
- data/lib/action_dispatch/routing/mapper.rb +501 -273
- 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 +203 -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/testing/assertions/dom.rb +3 -13
- data/lib/action_dispatch/testing/assertions/response.rb +32 -40
- data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
- data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
- data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
- data/lib/action_dispatch/testing/integration.rb +41 -22
- data/lib/action_dispatch/testing/test_process.rb +9 -6
- data/lib/action_dispatch/testing/test_request.rb +7 -3
- data/lib/action_pack.rb +1 -1
- data/lib/action_pack/version.rb +4 -4
- data/lib/action_view.rb +17 -8
- data/lib/action_view/base.rb +15 -34
- data/lib/action_view/buffers.rb +1 -1
- data/lib/action_view/context.rb +4 -4
- data/lib/action_view/dependency_tracker.rb +91 -0
- data/lib/action_view/digestor.rb +85 -0
- data/lib/action_view/flows.rb +1 -4
- data/lib/action_view/helpers.rb +2 -4
- data/lib/action_view/helpers/active_model_helper.rb +3 -4
- data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
- data/lib/action_view/helpers/asset_url_helper.rb +354 -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 +42 -29
- data/lib/action_view/helpers/csrf_helper.rb +0 -2
- data/lib/action_view/helpers/date_helper.rb +268 -247
- data/lib/action_view/helpers/debug_helper.rb +10 -11
- data/lib/action_view/helpers/form_helper.rb +904 -547
- data/lib/action_view/helpers/form_options_helper.rb +341 -166
- data/lib/action_view/helpers/form_tag_helper.rb +188 -88
- data/lib/action_view/helpers/javascript_helper.rb +23 -16
- data/lib/action_view/helpers/number_helper.rb +148 -354
- 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 -4
- data/lib/action_view/helpers/sanitize_helper.rb +3 -6
- data/lib/action_view/helpers/tag_helper.rb +43 -37
- data/lib/action_view/helpers/tags.rb +39 -0
- data/lib/action_view/helpers/tags/base.rb +148 -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 +41 -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/text_helper.rb +126 -113
- data/lib/action_view/helpers/translation_helper.rb +32 -16
- data/lib/action_view/helpers/url_helper.rb +200 -271
- 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 -39
- data/lib/action_view/model_naming.rb +12 -0
- data/lib/action_view/path_set.rb +9 -39
- 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 +10 -19
- data/lib/action_view/renderer/partial_renderer.rb +144 -81
- data/lib/action_view/renderer/renderer.rb +2 -19
- data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
- data/lib/action_view/renderer/template_renderer.rb +14 -13
- data/lib/action_view/routing_url_for.rb +107 -0
- data/lib/action_view/template.rb +22 -21
- data/lib/action_view/template/error.rb +22 -12
- data/lib/action_view/template/handlers.rb +12 -9
- data/lib/action_view/template/handlers/builder.rb +1 -1
- data/lib/action_view/template/handlers/erb.rb +11 -16
- data/lib/action_view/template/handlers/raw.rb +11 -0
- data/lib/action_view/template/resolver.rb +111 -83
- data/lib/action_view/template/text.rb +12 -8
- data/lib/action_view/template/types.rb +57 -0
- data/lib/action_view/test_case.rb +66 -43
- data/lib/action_view/testing/resolvers.rb +3 -2
- data/lib/action_view/vendor/html-scanner.rb +20 -0
- 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 +18 -7
- data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
- 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
- metadata +135 -125
- 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.rb +0 -6
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/railtie.rb +0 -62
- data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/hash_with_indifferent_access'
|
2
|
-
|
3
1
|
module ActionView
|
4
2
|
# This is the main entry point for rendering. It basically delegates
|
5
3
|
# to other objects like TemplateRenderer and PartialRenderer which
|
@@ -13,11 +11,6 @@ module ActionView
|
|
13
11
|
|
14
12
|
# Main render entry point shared by AV and AC.
|
15
13
|
def render(context, options)
|
16
|
-
if (options.is_a?(HashWithIndifferentAccess) && !options.respond_to?(:permitted?)) ||
|
17
|
-
(options.respond_to?(:permitted?) && !options.permitted?)
|
18
|
-
raise ArgumentError, "render parameters are not permitted"
|
19
|
-
end
|
20
|
-
|
21
14
|
if options.key?(:partial)
|
22
15
|
render_partial(context, options)
|
23
16
|
else
|
@@ -40,22 +33,12 @@ module ActionView
|
|
40
33
|
|
41
34
|
# Direct accessor to template rendering.
|
42
35
|
def render_template(context, options) #:nodoc:
|
43
|
-
|
36
|
+
TemplateRenderer.new(@lookup_context).render(context, options)
|
44
37
|
end
|
45
38
|
|
46
39
|
# Direct access to partial rendering.
|
47
40
|
def render_partial(context, options, &block) #:nodoc:
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
|
53
|
-
def _template_renderer #:nodoc:
|
54
|
-
@_template_renderer ||= TemplateRenderer.new(@lookup_context)
|
55
|
-
end
|
56
|
-
|
57
|
-
def _partial_renderer #:nodoc:
|
58
|
-
@_partial_renderer ||= PartialRenderer.new(@lookup_context)
|
41
|
+
PartialRenderer.new(@lookup_context).render(context, options, block)
|
59
42
|
end
|
60
43
|
end
|
61
44
|
end
|
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
# methods explicitly. We only load those extra methods if
|
3
|
-
# Fiber is available in the first place.
|
4
|
-
require 'fiber' if defined?(Fiber)
|
1
|
+
require 'fiber'
|
5
2
|
|
6
3
|
module ActionView
|
7
4
|
# == TODO
|
@@ -33,7 +30,7 @@ module ActionView
|
|
33
30
|
# This is the same logging logic as in ShowExceptions middleware.
|
34
31
|
# TODO Once "exceptron" is in, refactor this piece to simply re-use exceptron.
|
35
32
|
def log_error(exception) #:nodoc:
|
36
|
-
logger =
|
33
|
+
logger = ActionView::Base.logger
|
37
34
|
return unless logger
|
38
35
|
|
39
36
|
message = "\n#{exception.class} (#{exception.message}):\n"
|
@@ -1,18 +1,17 @@
|
|
1
1
|
require 'active_support/core_ext/object/try'
|
2
|
-
require 'active_support/core_ext/array/wrap'
|
3
2
|
|
4
3
|
module ActionView
|
5
4
|
class TemplateRenderer < AbstractRenderer #:nodoc:
|
6
5
|
def render(context, options)
|
7
6
|
@view = context
|
8
7
|
@details = extract_details(options)
|
9
|
-
extract_format(options[:file] || options[:template], @details)
|
10
8
|
template = determine_template(options)
|
11
9
|
context = @lookup_context
|
12
10
|
|
11
|
+
prepend_formats(template.formats)
|
12
|
+
|
13
13
|
unless context.rendered_format
|
14
|
-
context.
|
15
|
-
context.rendered_format = context.formats.first
|
14
|
+
context.rendered_format = template.formats.first || formats.last
|
16
15
|
end
|
17
16
|
|
18
17
|
render_template(template, options[:layout], options[:locals])
|
@@ -20,27 +19,29 @@ module ActionView
|
|
20
19
|
|
21
20
|
# Determine the template to be rendered using the given options.
|
22
21
|
def determine_template(options) #:nodoc:
|
23
|
-
keys = options
|
22
|
+
keys = options.fetch(:locals, {}).keys
|
23
|
+
|
24
24
|
if options.key?(:text)
|
25
|
-
Template::Text.new(options[:text], formats.
|
26
|
-
elsif options.key?(:app_template_file)
|
27
|
-
find_template(options[:app_template_file], nil, false, keys, @details)
|
25
|
+
Template::Text.new(options[:text], formats.first)
|
28
26
|
elsif options.key?(:file)
|
29
|
-
with_fallbacks {
|
27
|
+
with_fallbacks { find_template(options[:file], nil, false, keys, @details) }
|
30
28
|
elsif options.key?(:inline)
|
31
29
|
handler = Template.handler_for_extension(options[:type] || "erb")
|
32
30
|
Template.new(options[:inline], "inline template", handler, :locals => keys)
|
33
31
|
elsif options.key?(:template)
|
34
|
-
options[:template].respond_to?(:render)
|
35
|
-
options[:template]
|
32
|
+
if options[:template].respond_to?(:render)
|
33
|
+
options[:template]
|
34
|
+
else
|
35
|
+
find_template(options[:template], options[:prefixes], false, keys, @details)
|
36
|
+
end
|
36
37
|
else
|
37
38
|
raise ArgumentError, "You invoked render but did not give any of :partial, :template, :inline, :file or :text option."
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
|
-
# Renders the given template.
|
42
|
+
# Renders the given template. A string representing the layout can be
|
42
43
|
# supplied as well.
|
43
|
-
def render_template(template, layout_name = nil, locals =
|
44
|
+
def render_template(template, layout_name = nil, locals = nil) #:nodoc:
|
44
45
|
view, locals = @view, locals || {}
|
45
46
|
|
46
47
|
render_with_layout(layout_name, locals) do |layout|
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module ActionView
|
2
|
+
module RoutingUrlFor
|
3
|
+
|
4
|
+
# Returns the URL for the set of +options+ provided. This takes the
|
5
|
+
# same options as +url_for+ in Action Controller (see the
|
6
|
+
# documentation for <tt>ActionController::Base#url_for</tt>). Note that by default
|
7
|
+
# <tt>:only_path</tt> is <tt>true</tt> so you'll get the relative "/controller/action"
|
8
|
+
# instead of the fully qualified URL like "http://example.com/controller/action".
|
9
|
+
#
|
10
|
+
# ==== Options
|
11
|
+
# * <tt>:anchor</tt> - Specifies the anchor name to be appended to the path.
|
12
|
+
# * <tt>:only_path</tt> - If true, returns the relative URL (omitting the protocol, host name, and port) (<tt>true</tt> by default unless <tt>:host</tt> is specified).
|
13
|
+
# * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2005/". Note that this
|
14
|
+
# is currently not recommended since it breaks caching.
|
15
|
+
# * <tt>:host</tt> - Overrides the default (current) host if provided.
|
16
|
+
# * <tt>:protocol</tt> - Overrides the default (current) protocol if provided.
|
17
|
+
# * <tt>:user</tt> - Inline HTTP authentication (only plucked out if <tt>:password</tt> is also present).
|
18
|
+
# * <tt>:password</tt> - Inline HTTP authentication (only plucked out if <tt>:user</tt> is also present).
|
19
|
+
#
|
20
|
+
# ==== Relying on named routes
|
21
|
+
#
|
22
|
+
# Passing a record (like an Active Record) instead of a hash as the options parameter will
|
23
|
+
# trigger the named route for that record. The lookup will happen on the name of the class. So passing a
|
24
|
+
# Workshop object will attempt to use the +workshop_path+ route. If you have a nested route, such as
|
25
|
+
# +admin_workshop_path+ you'll have to call that explicitly (it's impossible for +url_for+ to guess that route).
|
26
|
+
#
|
27
|
+
# ==== Implicit Controller Namespacing
|
28
|
+
#
|
29
|
+
# Controllers passed in using the +:controller+ option will retain their namespace unless it is an absolute one.
|
30
|
+
#
|
31
|
+
# ==== Examples
|
32
|
+
# <%= url_for(action: 'index') %>
|
33
|
+
# # => /blog/
|
34
|
+
#
|
35
|
+
# <%= url_for(action: 'find', controller: 'books') %>
|
36
|
+
# # => /books/find
|
37
|
+
#
|
38
|
+
# <%= url_for(action: 'login', controller: 'members', only_path: false, protocol: 'https') %>
|
39
|
+
# # => https://www.example.com/members/login/
|
40
|
+
#
|
41
|
+
# <%= url_for(action: 'play', anchor: 'player') %>
|
42
|
+
# # => /messages/play/#player
|
43
|
+
#
|
44
|
+
# <%= url_for(action: 'jump', anchor: 'tax&ship') %>
|
45
|
+
# # => /testing/jump/#tax&ship
|
46
|
+
#
|
47
|
+
# <%= url_for(Workshop.new) %>
|
48
|
+
# # relies on Workshop answering a persisted? call (and in this case returning false)
|
49
|
+
# # => /workshops
|
50
|
+
#
|
51
|
+
# <%= url_for(@workshop) %>
|
52
|
+
# # calls @workshop.to_param which by default returns the id
|
53
|
+
# # => /workshops/5
|
54
|
+
#
|
55
|
+
# # to_param can be re-defined in a model to provide different URL names:
|
56
|
+
# # => /workshops/1-workshop-name
|
57
|
+
#
|
58
|
+
# <%= url_for("http://www.example.com") %>
|
59
|
+
# # => http://www.example.com
|
60
|
+
#
|
61
|
+
# <%= url_for(:back) %>
|
62
|
+
# # if request.env["HTTP_REFERER"] is set to "http://www.example.com"
|
63
|
+
# # => http://www.example.com
|
64
|
+
#
|
65
|
+
# <%= url_for(:back) %>
|
66
|
+
# # if request.env["HTTP_REFERER"] is not set or is blank
|
67
|
+
# # => javascript:history.back()
|
68
|
+
#
|
69
|
+
# <%= url_for(action: 'index', controller: 'users') %>
|
70
|
+
# # Assuming an "admin" namespace
|
71
|
+
# # => /admin/users
|
72
|
+
#
|
73
|
+
# <%= url_for(action: 'index', controller: '/users') %>
|
74
|
+
# # Specify absolute path with beginning slash
|
75
|
+
# # => /users
|
76
|
+
def url_for(options = nil)
|
77
|
+
case options
|
78
|
+
when String
|
79
|
+
options
|
80
|
+
when nil, Hash
|
81
|
+
options ||= {}
|
82
|
+
options = { :only_path => options[:host].nil? }.merge!(options.symbolize_keys)
|
83
|
+
super
|
84
|
+
when :back
|
85
|
+
_back_url
|
86
|
+
else
|
87
|
+
polymorphic_path(options)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def url_options #:nodoc:
|
92
|
+
return super unless controller.respond_to?(:url_options)
|
93
|
+
controller.url_options
|
94
|
+
end
|
95
|
+
|
96
|
+
def _routes_context #:nodoc:
|
97
|
+
controller
|
98
|
+
end
|
99
|
+
protected :_routes_context
|
100
|
+
|
101
|
+
def optimize_routes_generation? #:nodoc:
|
102
|
+
controller.respond_to?(:optimize_routes_generation?, true) ?
|
103
|
+
controller.optimize_routes_generation? : super
|
104
|
+
end
|
105
|
+
protected :optimize_routes_generation?
|
106
|
+
end
|
107
|
+
end
|
data/lib/action_view/template.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/core_ext/array/wrap'
|
2
|
-
require 'active_support/core_ext/object/blank'
|
3
1
|
require 'active_support/core_ext/object/try'
|
4
2
|
require 'active_support/core_ext/kernel/singleton_class'
|
5
3
|
require 'thread'
|
@@ -82,8 +80,7 @@ module ActionView
|
|
82
80
|
# problems with converting the user's data to
|
83
81
|
# the <tt>default_internal</tt>.
|
84
82
|
#
|
85
|
-
# To do so, simply raise
|
86
|
-
# as follows:
|
83
|
+
# To do so, simply raise +WrongEncodingError+ as follows:
|
87
84
|
#
|
88
85
|
# raise WrongEncodingError.new(
|
89
86
|
# problematic_string,
|
@@ -94,6 +91,7 @@ module ActionView
|
|
94
91
|
autoload :Error
|
95
92
|
autoload :Handlers
|
96
93
|
autoload :Text
|
94
|
+
autoload :Types
|
97
95
|
end
|
98
96
|
|
99
97
|
extend Template::Handlers
|
@@ -123,7 +121,7 @@ module ActionView
|
|
123
121
|
@locals = details[:locals] || []
|
124
122
|
@virtual_path = details[:virtual_path]
|
125
123
|
@updated_at = details[:updated_at] || Time.now
|
126
|
-
@formats
|
124
|
+
@formats = Array(format).map { |f| f.respond_to?(:ref) ? f.ref : f }
|
127
125
|
@compile_mutex = Mutex.new
|
128
126
|
end
|
129
127
|
|
@@ -149,9 +147,15 @@ module ActionView
|
|
149
147
|
end
|
150
148
|
|
151
149
|
def mime_type
|
150
|
+
message = 'Template#mime_type is deprecated and will be removed in Rails 4.1. Please use type method instead.'
|
151
|
+
ActiveSupport::Deprecation.warn message
|
152
152
|
@mime_type ||= Mime::Type.lookup_by_extension(@formats.first.to_s) if @formats.first
|
153
153
|
end
|
154
154
|
|
155
|
+
def type
|
156
|
+
@type ||= Types[@formats.first] if @formats.first
|
157
|
+
end
|
158
|
+
|
155
159
|
# Receives a view object and return a template similar to self by using @virtual_path.
|
156
160
|
#
|
157
161
|
# This method is useful if you have a template object but it does not contain its source
|
@@ -186,7 +190,7 @@ module ActionView
|
|
186
190
|
# before passing the source on to the template engine, leaving a
|
187
191
|
# blank line in its stead.
|
188
192
|
def encode!
|
189
|
-
return unless source.
|
193
|
+
return unless source.encoding == Encoding::BINARY
|
190
194
|
|
191
195
|
# Look for # encoding: *. If we find one, we'll encode the
|
192
196
|
# String in that encoding, otherwise, we'll use the
|
@@ -277,20 +281,18 @@ module ActionView
|
|
277
281
|
end
|
278
282
|
end_src
|
279
283
|
|
280
|
-
|
281
|
-
|
282
|
-
source.force_encoding(code.encoding)
|
284
|
+
# Make sure the source is in the encoding of the returned code
|
285
|
+
source.force_encoding(code.encoding)
|
283
286
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
+
# In case we get back a String from a handler that is not in
|
288
|
+
# BINARY or the default_internal, encode it to the default_internal
|
289
|
+
source.encode!
|
287
290
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
end
|
291
|
+
# Now, validate that the source we got back from the template
|
292
|
+
# handler is valid in the default_internal. This is for handlers
|
293
|
+
# that handle encoding but screw up
|
294
|
+
unless source.valid_encoding?
|
295
|
+
raise WrongEncodingError.new(@source, Encoding.default_internal)
|
294
296
|
end
|
295
297
|
|
296
298
|
begin
|
@@ -303,7 +305,7 @@ module ActionView
|
|
303
305
|
logger.debug "Backtrace: #{e.backtrace.join("\n")}"
|
304
306
|
end
|
305
307
|
|
306
|
-
raise ActionView::Template::Error.new(self,
|
308
|
+
raise ActionView::Template::Error.new(self, e)
|
307
309
|
end
|
308
310
|
end
|
309
311
|
|
@@ -312,13 +314,12 @@ module ActionView
|
|
312
314
|
e.sub_template_of(self)
|
313
315
|
raise e
|
314
316
|
else
|
315
|
-
assigns = view.respond_to?(:assigns) ? view.assigns : {}
|
316
317
|
template = self
|
317
318
|
unless template.source
|
318
319
|
template = refresh(view)
|
319
320
|
template.encode!
|
320
321
|
end
|
321
|
-
raise Template::Error.new(template,
|
322
|
+
raise Template::Error.new(template, e)
|
322
323
|
end
|
323
324
|
end
|
324
325
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require "active_support/core_ext/array/wrap"
|
2
1
|
require "active_support/core_ext/enumerable"
|
3
2
|
|
4
3
|
module ActionView
|
@@ -9,13 +8,16 @@ module ActionView
|
|
9
8
|
class EncodingError < StandardError #:nodoc:
|
10
9
|
end
|
11
10
|
|
11
|
+
class MissingRequestError < StandardError #:nodoc:
|
12
|
+
end
|
13
|
+
|
12
14
|
class WrongEncodingError < EncodingError #:nodoc:
|
13
15
|
def initialize(string, encoding)
|
14
16
|
@string, @encoding = string, encoding
|
15
17
|
end
|
16
18
|
|
17
19
|
def message
|
18
|
-
@string.force_encoding(
|
20
|
+
@string.force_encoding(Encoding::ASCII_8BIT)
|
19
21
|
"Your template was not saved as valid #{@encoding}. Please " \
|
20
22
|
"either specify #{@encoding} as the encoding for your template " \
|
21
23
|
"in your text editor, or mark the template with its " \
|
@@ -30,7 +32,7 @@ module ActionView
|
|
30
32
|
|
31
33
|
def initialize(paths, path, prefixes, partial, details, *)
|
32
34
|
@path = path
|
33
|
-
prefixes = Array
|
35
|
+
prefixes = Array(prefixes)
|
34
36
|
template_type = if partial
|
35
37
|
"partial"
|
36
38
|
elsif path =~ /layouts/i
|
@@ -56,9 +58,9 @@ module ActionView
|
|
56
58
|
|
57
59
|
attr_reader :original_exception, :backtrace
|
58
60
|
|
59
|
-
def initialize(template,
|
61
|
+
def initialize(template, original_exception)
|
60
62
|
super(original_exception.message)
|
61
|
-
@template, @
|
63
|
+
@template, @original_exception = template, original_exception
|
62
64
|
@sub_templates = nil
|
63
65
|
@backtrace = original_exception.backtrace
|
64
66
|
end
|
@@ -76,7 +78,7 @@ module ActionView
|
|
76
78
|
end
|
77
79
|
end
|
78
80
|
|
79
|
-
def source_extract(indentation = 0)
|
81
|
+
def source_extract(indentation = 0, output = :console)
|
80
82
|
return unless num = line_number
|
81
83
|
num = num.to_i
|
82
84
|
|
@@ -85,14 +87,10 @@ module ActionView
|
|
85
87
|
start_on_line = [ num - SOURCE_CODE_RADIUS - 1, 0 ].max
|
86
88
|
end_on_line = [ num + SOURCE_CODE_RADIUS - 1, source_code.length].min
|
87
89
|
|
88
|
-
indent =
|
89
|
-
line_counter = start_on_line
|
90
|
+
indent = end_on_line.to_s.size + indentation
|
90
91
|
return unless source_code = source_code[start_on_line..end_on_line]
|
91
92
|
|
92
|
-
source_code
|
93
|
-
line_counter += 1
|
94
|
-
"#{indent}#{line_counter}: #{line}\n"
|
95
|
-
end
|
93
|
+
formatted_code_for(source_code, start_on_line, indent, output)
|
96
94
|
end
|
97
95
|
|
98
96
|
def sub_template_of(template_path)
|
@@ -121,6 +119,18 @@ module ActionView
|
|
121
119
|
'in '
|
122
120
|
end + file_name
|
123
121
|
end
|
122
|
+
|
123
|
+
def formatted_code_for(source_code, line_counter, indent, output)
|
124
|
+
start_value = (output == :html) ? {} : ""
|
125
|
+
source_code.inject(start_value) do |result, line|
|
126
|
+
line_counter += 1
|
127
|
+
if output == :html
|
128
|
+
result.update(line_counter.to_s => "%#{indent}s %s\n" % ["", line])
|
129
|
+
else
|
130
|
+
result << "%#{indent}s: %s\n" % [line_counter, line]
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
124
134
|
end
|
125
135
|
end
|
126
136
|
|
@@ -4,10 +4,13 @@ module ActionView #:nodoc:
|
|
4
4
|
module Handlers #:nodoc:
|
5
5
|
autoload :ERB, 'action_view/template/handlers/erb'
|
6
6
|
autoload :Builder, 'action_view/template/handlers/builder'
|
7
|
+
autoload :Raw, 'action_view/template/handlers/raw'
|
7
8
|
|
8
9
|
def self.extended(base)
|
9
10
|
base.register_default_template_handler :erb, ERB.new
|
10
11
|
base.register_template_handler :builder, Builder.new
|
12
|
+
base.register_template_handler :raw, Raw.new
|
13
|
+
base.register_template_handler :ruby, :source.to_proc
|
11
14
|
end
|
12
15
|
|
13
16
|
@@template_handlers = {}
|
@@ -17,15 +20,15 @@ module ActionView #:nodoc:
|
|
17
20
|
@@template_extensions ||= @@template_handlers.keys
|
18
21
|
end
|
19
22
|
|
20
|
-
# Register
|
21
|
-
#
|
22
|
-
# The
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
# Register an object that knows how to handle template files with the given
|
24
|
+
# extensions. This can be used to implement new template types.
|
25
|
+
# The handler must respond to `:call`, which will be passed the template
|
26
|
+
# and should return the rendered template as a String.
|
27
|
+
def register_template_handler(*extensions, handler)
|
28
|
+
raise(ArgumentError, "Extension is required") if extensions.empty?
|
29
|
+
extensions.each do |extension|
|
30
|
+
@@template_handlers[extension.to_sym] = handler
|
31
|
+
end
|
29
32
|
@@template_extensions = nil
|
30
33
|
end
|
31
34
|
|