actionpack 2.3.18 → 3.0.0.beta
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.
- data/CHANGELOG +15 -64
- data/README +39 -48
- data/lib/abstract_controller.rb +22 -0
- data/lib/abstract_controller/base.rb +191 -0
- data/lib/abstract_controller/callbacks.rb +113 -0
- data/lib/abstract_controller/collector.rb +30 -0
- data/lib/abstract_controller/compatibility.rb +18 -0
- data/lib/abstract_controller/helpers.rb +163 -0
- data/lib/abstract_controller/layouts.rb +413 -0
- data/lib/abstract_controller/localized_cache.rb +49 -0
- data/lib/abstract_controller/logger.rb +13 -0
- data/lib/abstract_controller/rendering.rb +238 -0
- data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
- data/lib/action_controller.rb +68 -102
- data/lib/action_controller/base.rb +77 -1409
- data/lib/action_controller/caching.rb +58 -45
- data/lib/action_controller/caching/actions.rb +100 -114
- data/lib/action_controller/caching/fragments.rb +17 -19
- data/lib/action_controller/caching/pages.rb +12 -6
- data/lib/action_controller/caching/sweeping.rb +42 -0
- data/lib/action_controller/deprecated.rb +5 -0
- data/lib/action_controller/deprecated/dispatcher.rb +28 -0
- data/lib/action_controller/deprecated/integration_test.rb +2 -0
- data/lib/action_controller/deprecated/performance_test.rb +1 -0
- data/lib/action_controller/metal.rb +125 -0
- data/lib/action_controller/metal/compatibility.rb +141 -0
- data/lib/action_controller/metal/conditional_get.rb +86 -0
- data/lib/action_controller/metal/configuration.rb +28 -0
- data/lib/action_controller/metal/cookies.rb +17 -0
- data/lib/action_controller/metal/exceptions.rb +46 -0
- data/lib/action_controller/metal/flash.rb +28 -0
- data/lib/action_controller/metal/head.rb +33 -0
- data/lib/action_controller/metal/helpers.rb +116 -0
- data/lib/action_controller/metal/hide_actions.rb +50 -0
- data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
- data/lib/action_controller/metal/instrumentation.rb +99 -0
- data/lib/action_controller/metal/mime_responds.rb +300 -0
- data/lib/action_controller/metal/rack_delegation.rb +35 -0
- data/lib/action_controller/metal/redirecting.rb +90 -0
- data/lib/action_controller/metal/renderers.rb +95 -0
- data/lib/action_controller/metal/rendering.rb +69 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
- data/lib/action_controller/metal/rescue.rb +13 -0
- data/lib/action_controller/metal/responder.rb +220 -0
- data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
- data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
- data/lib/action_controller/metal/testing.rb +42 -0
- data/lib/action_controller/metal/url_for.rb +157 -0
- data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
- data/lib/action_controller/middleware.rb +38 -0
- data/lib/action_controller/polymorphic_routes.rb +20 -26
- data/lib/action_controller/railtie.rb +30 -0
- data/lib/action_controller/railties/subscriber.rb +63 -0
- data/lib/action_controller/record_identifier.rb +3 -16
- data/lib/action_controller/test_case.rb +156 -18
- data/lib/action_controller/url_rewriter.rb +47 -200
- data/lib/action_controller/vendor/html-scanner.rb +16 -12
- data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
- data/lib/action_dispatch.rb +88 -0
- data/lib/action_dispatch/http/cache.rb +123 -0
- data/lib/action_dispatch/http/filter_parameters.rb +98 -0
- data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
- data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
- data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
- data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
- data/lib/action_dispatch/http/parameters.rb +49 -0
- data/lib/action_dispatch/http/request.rb +223 -0
- data/lib/action_dispatch/http/response.rb +209 -0
- data/lib/action_dispatch/http/upload.rb +48 -0
- data/lib/action_dispatch/http/url.rb +129 -0
- data/lib/action_dispatch/middleware/callbacks.rb +50 -0
- data/lib/action_dispatch/middleware/cascade.rb +29 -0
- data/lib/action_dispatch/middleware/cookies.rb +216 -0
- data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
- data/lib/action_dispatch/middleware/head.rb +18 -0
- data/lib/action_dispatch/middleware/params_parser.rb +78 -0
- data/lib/action_dispatch/middleware/rescue.rb +26 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
- data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
- data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
- data/lib/action_dispatch/middleware/static.rb +44 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
- data/lib/action_dispatch/railtie.rb +15 -0
- data/lib/action_dispatch/routing.rb +217 -0
- data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
- data/lib/action_dispatch/routing/mapper.rb +649 -0
- data/lib/action_dispatch/routing/route.rb +55 -0
- data/lib/action_dispatch/routing/route_set.rb +445 -0
- data/lib/action_dispatch/testing/assertions.rb +21 -0
- data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
- data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
- data/lib/action_dispatch/testing/assertions/response.rb +154 -0
- data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
- data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
- data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
- data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
- data/lib/action_dispatch/testing/performance_test.rb +17 -0
- data/lib/action_dispatch/testing/test_process.rb +42 -0
- data/lib/action_dispatch/testing/test_request.rb +83 -0
- data/lib/action_dispatch/testing/test_response.rb +136 -0
- data/lib/action_pack/version.rb +3 -3
- data/lib/action_view.rb +29 -26
- data/lib/action_view/base.rb +101 -148
- data/lib/action_view/context.rb +44 -0
- data/lib/action_view/helpers.rb +6 -4
- data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
- data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
- data/lib/action_view/helpers/cache_helper.rb +1 -1
- data/lib/action_view/helpers/capture_helper.rb +40 -8
- data/lib/action_view/helpers/csrf_helper.rb +2 -4
- data/lib/action_view/helpers/date_helper.rb +14 -15
- data/lib/action_view/helpers/form_helper.rb +121 -24
- data/lib/action_view/helpers/form_options_helper.rb +26 -25
- data/lib/action_view/helpers/form_tag_helper.rb +42 -33
- data/lib/action_view/helpers/javascript_helper.rb +1 -109
- data/lib/action_view/helpers/number_helper.rb +4 -1
- data/lib/action_view/helpers/prototype_helper.rb +75 -499
- data/lib/action_view/helpers/raw_output_helper.rb +1 -1
- data/lib/action_view/helpers/record_tag_helper.rb +3 -3
- data/lib/action_view/helpers/sanitize_helper.rb +3 -2
- data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
- data/lib/action_view/helpers/tag_helper.rb +12 -13
- data/lib/action_view/helpers/text_helper.rb +33 -38
- data/lib/action_view/helpers/translation_helper.rb +11 -35
- data/lib/action_view/helpers/url_helper.rb +140 -134
- data/lib/action_view/locale/en.yml +34 -28
- data/lib/action_view/paths.rb +27 -24
- data/lib/action_view/railtie.rb +17 -0
- data/lib/action_view/railties/subscriber.rb +24 -0
- data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
- data/lib/action_view/render/rendering.rb +117 -0
- data/lib/action_view/template.rb +88 -217
- data/lib/action_view/template/error.rb +105 -0
- data/lib/action_view/template/handler.rb +41 -0
- data/lib/action_view/template/handlers.rb +54 -0
- data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
- data/lib/action_view/template/handlers/erb.rb +58 -0
- data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
- data/lib/action_view/template/resolver.rb +164 -0
- data/lib/action_view/template/text.rb +40 -0
- data/lib/action_view/test_case.rb +18 -18
- metadata +165 -420
- data/RUNNING_UNIT_TESTS +0 -24
- data/Rakefile +0 -158
- data/install.rb +0 -30
- data/lib/action_controller/assertions/dom_assertions.rb +0 -55
- data/lib/action_controller/assertions/response_assertions.rb +0 -169
- data/lib/action_controller/benchmarking.rb +0 -107
- data/lib/action_controller/caching/sweeper.rb +0 -45
- data/lib/action_controller/cgi_ext.rb +0 -15
- data/lib/action_controller/cgi_ext/cookie.rb +0 -112
- data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
- data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
- data/lib/action_controller/cgi_process.rb +0 -77
- data/lib/action_controller/cookies.rb +0 -197
- data/lib/action_controller/dispatcher.rb +0 -133
- data/lib/action_controller/failsafe.rb +0 -87
- data/lib/action_controller/filters.rb +0 -680
- data/lib/action_controller/helpers.rb +0 -225
- data/lib/action_controller/layout.rb +0 -286
- data/lib/action_controller/middlewares.rb +0 -14
- data/lib/action_controller/mime_responds.rb +0 -193
- data/lib/action_controller/params_parser.rb +0 -77
- data/lib/action_controller/performance_test.rb +0 -15
- data/lib/action_controller/rack_lint_patch.rb +0 -36
- data/lib/action_controller/reloader.rb +0 -54
- data/lib/action_controller/request.rb +0 -518
- data/lib/action_controller/request_forgery_protection.rb +0 -116
- data/lib/action_controller/rescue.rb +0 -183
- data/lib/action_controller/resources.rb +0 -682
- data/lib/action_controller/response.rb +0 -237
- data/lib/action_controller/routing.rb +0 -388
- data/lib/action_controller/routing/builder.rb +0 -197
- data/lib/action_controller/routing/optimisations.rb +0 -130
- data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
- data/lib/action_controller/routing/route.rb +0 -265
- data/lib/action_controller/routing/route_set.rb +0 -503
- data/lib/action_controller/routing/routing_ext.rb +0 -49
- data/lib/action_controller/routing/segments.rb +0 -343
- data/lib/action_controller/session/abstract_store.rb +0 -276
- data/lib/action_controller/session/mem_cache_store.rb +0 -60
- data/lib/action_controller/status_codes.rb +0 -88
- data/lib/action_controller/string_coercion.rb +0 -29
- data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
- data/lib/action_controller/test_process.rb +0 -580
- data/lib/action_controller/uploaded_file.rb +0 -44
- data/lib/action_view/helpers/benchmark_helper.rb +0 -54
- data/lib/action_view/inline_template.rb +0 -19
- data/lib/action_view/reloadable_template.rb +0 -117
- data/lib/action_view/renderable.rb +0 -109
- data/lib/action_view/renderable_partial.rb +0 -53
- data/lib/action_view/template_error.rb +0 -99
- data/lib/action_view/template_handler.rb +0 -34
- data/lib/action_view/template_handlers.rb +0 -48
- data/lib/action_view/template_handlers/erb.rb +0 -25
- data/lib/actionpack.rb +0 -2
- data/test/abstract_unit.rb +0 -78
- data/test/active_record_unit.rb +0 -104
- data/test/activerecord/active_record_store_test.rb +0 -221
- data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
- data/test/adv_attr_test.rb +0 -20
- data/test/controller/action_pack_assertions_test.rb +0 -545
- data/test/controller/addresses_render_test.rb +0 -37
- data/test/controller/assert_select_test.rb +0 -735
- data/test/controller/base_test.rb +0 -217
- data/test/controller/benchmark_test.rb +0 -32
- data/test/controller/caching_test.rb +0 -743
- data/test/controller/capture_test.rb +0 -66
- data/test/controller/content_type_test.rb +0 -178
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +0 -208
- data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
- data/test/controller/dispatcher_test.rb +0 -144
- data/test/controller/dom_assertions_test.rb +0 -53
- data/test/controller/failsafe_test.rb +0 -60
- data/test/controller/fake_controllers.rb +0 -33
- data/test/controller/fake_models.rb +0 -19
- data/test/controller/filter_params_test.rb +0 -52
- data/test/controller/filters_test.rb +0 -885
- data/test/controller/flash_test.rb +0 -174
- data/test/controller/header_test.rb +0 -14
- data/test/controller/helper_test.rb +0 -224
- data/test/controller/html-scanner/cdata_node_test.rb +0 -15
- data/test/controller/html-scanner/document_test.rb +0 -148
- data/test/controller/html-scanner/node_test.rb +0 -89
- data/test/controller/html-scanner/sanitizer_test.rb +0 -300
- data/test/controller/html-scanner/tag_node_test.rb +0 -238
- data/test/controller/html-scanner/text_node_test.rb +0 -50
- data/test/controller/html-scanner/tokenizer_test.rb +0 -131
- data/test/controller/http_basic_authentication_test.rb +0 -113
- data/test/controller/http_digest_authentication_test.rb +0 -254
- data/test/controller/integration_test.rb +0 -526
- data/test/controller/layout_test.rb +0 -215
- data/test/controller/localized_templates_test.rb +0 -24
- data/test/controller/logging_test.rb +0 -46
- data/test/controller/middleware_stack_test.rb +0 -90
- data/test/controller/mime_responds_test.rb +0 -536
- data/test/controller/mime_type_test.rb +0 -93
- data/test/controller/output_escaping_test.rb +0 -19
- data/test/controller/polymorphic_routes_test.rb +0 -297
- data/test/controller/rack_test.rb +0 -308
- data/test/controller/record_identifier_test.rb +0 -139
- data/test/controller/redirect_test.rb +0 -285
- data/test/controller/reloader_test.rb +0 -125
- data/test/controller/render_test.rb +0 -1783
- data/test/controller/request/json_params_parsing_test.rb +0 -65
- data/test/controller/request/multipart_params_parsing_test.rb +0 -177
- data/test/controller/request/query_string_parsing_test.rb +0 -129
- data/test/controller/request/test_request_test.rb +0 -35
- data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
- data/test/controller/request/xml_params_parsing_test.rb +0 -103
- data/test/controller/request_forgery_protection_test.rb +0 -233
- data/test/controller/request_test.rb +0 -398
- data/test/controller/rescue_test.rb +0 -541
- data/test/controller/resources_test.rb +0 -1393
- data/test/controller/routing_test.rb +0 -2592
- data/test/controller/selector_test.rb +0 -628
- data/test/controller/send_file_test.rb +0 -171
- data/test/controller/session/abstract_store_test.rb +0 -64
- data/test/controller/session/cookie_store_test.rb +0 -354
- data/test/controller/session/mem_cache_store_test.rb +0 -187
- data/test/controller/session/test_session_test.rb +0 -58
- data/test/controller/test_test.rb +0 -700
- data/test/controller/translation_test.rb +0 -26
- data/test/controller/url_rewriter_test.rb +0 -395
- data/test/controller/verification_test.rb +0 -270
- data/test/controller/view_paths_test.rb +0 -141
- data/test/controller/webservice_test.rb +0 -273
- data/test/fixtures/_top_level_partial.html.erb +0 -1
- data/test/fixtures/_top_level_partial_only.erb +0 -1
- data/test/fixtures/addresses/list.erb +0 -1
- data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
- data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
- data/test/fixtures/companies.yml +0 -24
- data/test/fixtures/company.rb +0 -10
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
- data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
- data/test/fixtures/customers/_customer.html.erb +0 -1
- data/test/fixtures/db_definitions/sqlite.sql +0 -49
- data/test/fixtures/developer.rb +0 -9
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers/_developer.erb +0 -1
- data/test/fixtures/developers_projects.yml +0 -13
- data/test/fixtures/failsafe/500.html +0 -1
- data/test/fixtures/fun/games/_game.erb +0 -1
- data/test/fixtures/fun/games/hello_world.erb +0 -1
- data/test/fixtures/fun/serious/games/_game.erb +0 -1
- data/test/fixtures/functional_caching/_partial.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
- data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
- data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
- data/test/fixtures/helpers/abc_helper.rb +0 -5
- data/test/fixtures/helpers/fun/games_helper.rb +0 -3
- data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
- data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
- data/test/fixtures/layouts/_column.html.erb +0 -2
- data/test/fixtures/layouts/block_with_layout.erb +0 -3
- data/test/fixtures/layouts/builder.builder +0 -3
- data/test/fixtures/layouts/default_html.html.erb +0 -1
- data/test/fixtures/layouts/partial_with_layout.erb +0 -3
- data/test/fixtures/layouts/standard.erb +0 -1
- data/test/fixtures/layouts/talk_from_action.erb +0 -2
- data/test/fixtures/layouts/xhr.html.erb +0 -2
- data/test/fixtures/layouts/yield.erb +0 -2
- data/test/fixtures/localized/hello_world.de.html +0 -1
- data/test/fixtures/localized/hello_world.en.html +0 -1
- data/test/fixtures/mascot.rb +0 -3
- data/test/fixtures/mascots.yml +0 -4
- data/test/fixtures/mascots/_mascot.html.erb +0 -1
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +0 -10
- data/test/fixtures/multipart/bracketed_param +0 -5
- data/test/fixtures/multipart/empty +0 -10
- data/test/fixtures/multipart/hello.txt +0 -1
- data/test/fixtures/multipart/large_text_file +0 -10
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +0 -9
- data/test/fixtures/multipart/single_parameter +0 -5
- data/test/fixtures/multipart/text_file +0 -10
- data/test/fixtures/override/test/hello_world.erb +0 -1
- data/test/fixtures/override2/layouts/test/sub.erb +0 -1
- data/test/fixtures/post_test/layouts/post.html.erb +0 -1
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
- data/test/fixtures/post_test/post/index.html.erb +0 -1
- data/test/fixtures/post_test/post/index.iphone.erb +0 -1
- data/test/fixtures/post_test/super_post/index.html.erb +0 -1
- data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
- data/test/fixtures/project.rb +0 -3
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/projects/_project.erb +0 -1
- data/test/fixtures/public/404.html +0 -1
- data/test/fixtures/public/500.da.html +0 -1
- data/test/fixtures/public/500.html +0 -1
- data/test/fixtures/public/absolute/test.css +0 -23
- data/test/fixtures/public/absolute/test.js +0 -63
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +0 -1
- data/test/fixtures/public/javascripts/bank.js +0 -1
- data/test/fixtures/public/javascripts/controls.js +0 -1
- data/test/fixtures/public/javascripts/dragdrop.js +0 -1
- data/test/fixtures/public/javascripts/effects.js +0 -1
- data/test/fixtures/public/javascripts/prototype.js +0 -1
- data/test/fixtures/public/javascripts/robber.js +0 -1
- data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
- data/test/fixtures/public/javascripts/version.1.0.js +0 -1
- data/test/fixtures/public/stylesheets/bank.css +0 -1
- data/test/fixtures/public/stylesheets/robber.css +0 -1
- data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
- data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
- data/test/fixtures/quiz/questions/_question.html.erb +0 -1
- data/test/fixtures/replies.yml +0 -15
- data/test/fixtures/replies/_reply.erb +0 -1
- data/test/fixtures/reply.rb +0 -7
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
- data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
- data/test/fixtures/scope/test/modgreet.erb +0 -1
- data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
- data/test/fixtures/shared.html.erb +0 -1
- data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
- data/test/fixtures/test/_counter.html.erb +0 -1
- data/test/fixtures/test/_customer.erb +0 -1
- data/test/fixtures/test/_customer_counter.erb +0 -1
- data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
- data/test/fixtures/test/_customer_greeting.erb +0 -1
- data/test/fixtures/test/_customer_with_var.erb +0 -1
- data/test/fixtures/test/_form.erb +0 -1
- data/test/fixtures/test/_from_helper.erb +0 -1
- data/test/fixtures/test/_hash_greeting.erb +0 -1
- data/test/fixtures/test/_hash_object.erb +0 -2
- data/test/fixtures/test/_hello.builder +0 -1
- data/test/fixtures/test/_labelling_form.erb +0 -1
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
- data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
- data/test/fixtures/test/_local_inspector.html.erb +0 -1
- data/test/fixtures/test/_one.html.erb +0 -1
- data/test/fixtures/test/_partial.erb +0 -1
- data/test/fixtures/test/_partial.html.erb +0 -1
- data/test/fixtures/test/_partial.js.erb +0 -1
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
- data/test/fixtures/test/_partial_only.erb +0 -1
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
- data/test/fixtures/test/_person.erb +0 -2
- data/test/fixtures/test/_raise.html.erb +0 -1
- data/test/fixtures/test/_two.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
- data/test/fixtures/test/action_talk_to_layout.erb +0 -2
- data/test/fixtures/test/array_translation.erb +0 -1
- data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
- data/test/fixtures/test/capturing.erb +0 -4
- data/test/fixtures/test/content_for.erb +0 -2
- data/test/fixtures/test/content_for_concatenated.erb +0 -3
- data/test/fixtures/test/content_for_with_parameter.erb +0 -2
- data/test/fixtures/test/delete_with_js.rjs +0 -2
- data/test/fixtures/test/dont_pick_me +0 -1
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/enum_rjs_test.rjs +0 -6
- data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.builder +0 -1
- data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
- data/test/fixtures/test/greeting.erb +0 -1
- data/test/fixtures/test/greeting.js.rjs +0 -1
- data/test/fixtures/test/hello.builder +0 -4
- data/test/fixtures/test/hello_world.da.html.erb +0 -1
- data/test/fixtures/test/hello_world.erb +0 -1
- data/test/fixtures/test/hello_world.erb~ +0 -1
- data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
- data/test/fixtures/test/hello_world_container.builder +0 -3
- data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
- data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
- data/test/fixtures/test/hello_xml_world.builder +0 -11
- data/test/fixtures/test/hyphen-ated.erb +0 -1
- data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
- data/test/fixtures/test/list.erb +0 -1
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
- data/test/fixtures/test/nested_layout.erb +0 -3
- data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
- data/test/fixtures/test/potential_conflicts.erb +0 -4
- data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_file_from_template.html.erb +0 -1
- data/test/fixtures/test/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/render_file_with_locals.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
- data/test/fixtures/test/render_to_string_test.erb +0 -1
- data/test/fixtures/test/scoped_array_translation.erb +0 -1
- data/test/fixtures/test/sub_template_raise.html.erb +0 -1
- data/test/fixtures/test/template.erb +0 -1
- data/test/fixtures/test/translation.erb +0 -1
- data/test/fixtures/test/update_element_with_capture.erb +0 -9
- data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
- data/test/fixtures/test/utf8.html.erb +0 -4
- data/test/fixtures/test/utf8_magic.html.erb +0 -5
- data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
- data/test/fixtures/topic.rb +0 -3
- data/test/fixtures/topics.yml +0 -22
- data/test/fixtures/topics/_topic.html.erb +0 -1
- data/test/template/active_record_helper_i18n_test.rb +0 -51
- data/test/template/active_record_helper_test.rb +0 -302
- data/test/template/asset_tag_helper_test.rb +0 -770
- data/test/template/atom_feed_helper_test.rb +0 -315
- data/test/template/benchmark_helper_test.rb +0 -86
- data/test/template/compiled_templates_test.rb +0 -204
- data/test/template/date_helper_i18n_test.rb +0 -121
- data/test/template/date_helper_test.rb +0 -2603
- data/test/template/erb_util_test.rb +0 -36
- data/test/template/form_helper_test.rb +0 -1447
- data/test/template/form_options_helper_i18n_test.rb +0 -27
- data/test/template/form_options_helper_test.rb +0 -811
- data/test/template/form_tag_helper_test.rb +0 -356
- data/test/template/javascript_helper_test.rb +0 -106
- data/test/template/number_helper_i18n_test.rb +0 -69
- data/test/template/number_helper_test.rb +0 -132
- data/test/template/prototype_helper_test.rb +0 -639
- data/test/template/raw_output_helper_test.rb +0 -21
- data/test/template/record_tag_helper_test.rb +0 -58
- data/test/template/render_test.rb +0 -329
- data/test/template/sanitize_helper_test.rb +0 -57
- data/test/template/scriptaculous_helper_test.rb +0 -90
- data/test/template/tag_helper_test.rb +0 -98
- data/test/template/template_test.rb +0 -32
- data/test/template/test_test.rb +0 -54
- data/test/template/text_helper_test.rb +0 -601
- data/test/template/translation_helper_test.rb +0 -95
- data/test/template/url_helper_test.rb +0 -641
- data/test/testing_sandbox.rb +0 -15
- data/test/view/test_case_test.rb +0 -176
@@ -1,133 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
# Dispatches requests to the appropriate controller and takes care of
|
3
|
-
# reloading the app after each request when Dependencies.load? is true.
|
4
|
-
class Dispatcher
|
5
|
-
@@cache_classes = true
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def define_dispatcher_callbacks(cache_classes)
|
9
|
-
@@cache_classes = cache_classes
|
10
|
-
unless cache_classes
|
11
|
-
ActionView::Helpers::AssetTagHelper.cache_asset_timestamps = false
|
12
|
-
end
|
13
|
-
|
14
|
-
if defined?(ActiveRecord)
|
15
|
-
to_prepare(:activerecord_instantiate_observers) { ActiveRecord::Base.instantiate_observers }
|
16
|
-
end
|
17
|
-
|
18
|
-
after_dispatch :flush_logger if Base.logger && Base.logger.respond_to?(:flush)
|
19
|
-
|
20
|
-
to_prepare do
|
21
|
-
I18n.reload!
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# DEPRECATE: Remove CGI support
|
26
|
-
def dispatch(cgi = nil, session_options = CgiRequest::DEFAULT_SESSION_OPTIONS, output = $stdout)
|
27
|
-
new(output).dispatch_cgi(cgi, session_options)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Add a preparation callback. Preparation callbacks are run before every
|
31
|
-
# request in development mode, and before the first request in production
|
32
|
-
# mode.
|
33
|
-
#
|
34
|
-
# An optional identifier may be supplied for the callback. If provided,
|
35
|
-
# to_prepare may be called again with the same identifier to replace the
|
36
|
-
# existing callback. Passing an identifier is a suggested practice if the
|
37
|
-
# code adding a preparation block may be reloaded.
|
38
|
-
def to_prepare(identifier = nil, &block)
|
39
|
-
@prepare_dispatch_callbacks ||= ActiveSupport::Callbacks::CallbackChain.new
|
40
|
-
callback = ActiveSupport::Callbacks::Callback.new(:prepare_dispatch, block, :identifier => identifier)
|
41
|
-
@prepare_dispatch_callbacks.replace_or_append!(callback)
|
42
|
-
end
|
43
|
-
|
44
|
-
def run_prepare_callbacks
|
45
|
-
if defined?(Rails) && Rails.logger
|
46
|
-
logger = Rails.logger
|
47
|
-
else
|
48
|
-
logger = Logger.new($stderr)
|
49
|
-
end
|
50
|
-
|
51
|
-
new(logger).send :run_callbacks, :prepare_dispatch
|
52
|
-
end
|
53
|
-
|
54
|
-
def reload_application
|
55
|
-
# Run prepare callbacks before every request in development mode
|
56
|
-
run_prepare_callbacks
|
57
|
-
|
58
|
-
Routing::Routes.reload
|
59
|
-
end
|
60
|
-
|
61
|
-
def cleanup_application
|
62
|
-
# Cleanup the application before processing the current request.
|
63
|
-
ActiveRecord::Base.reset_subclasses if defined?(ActiveRecord)
|
64
|
-
ActiveSupport::Dependencies.clear
|
65
|
-
ActiveRecord::Base.clear_reloadable_connections! if defined?(ActiveRecord)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
cattr_accessor :middleware
|
70
|
-
self.middleware = MiddlewareStack.new do |middleware|
|
71
|
-
middlewares = File.join(File.dirname(__FILE__), "middlewares.rb")
|
72
|
-
middleware.instance_eval(File.read(middlewares))
|
73
|
-
end
|
74
|
-
|
75
|
-
include ActiveSupport::Callbacks
|
76
|
-
define_callbacks :prepare_dispatch, :before_dispatch, :after_dispatch
|
77
|
-
|
78
|
-
# DEPRECATE: Remove arguments, since they are only used by CGI
|
79
|
-
def initialize(output = $stdout, request = nil, response = nil)
|
80
|
-
@output = output
|
81
|
-
build_middleware_stack if @@cache_classes
|
82
|
-
end
|
83
|
-
|
84
|
-
def dispatch
|
85
|
-
begin
|
86
|
-
run_callbacks :before_dispatch
|
87
|
-
Routing::Routes.call(@env)
|
88
|
-
rescue Exception => exception
|
89
|
-
if controller ||= (::ApplicationController rescue Base)
|
90
|
-
controller.call_with_exception(@env, exception).to_a
|
91
|
-
else
|
92
|
-
raise exception
|
93
|
-
end
|
94
|
-
ensure
|
95
|
-
run_callbacks :after_dispatch, :enumerator => :reverse_each
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# DEPRECATE: Remove CGI support
|
100
|
-
def dispatch_cgi(cgi, session_options)
|
101
|
-
CGIHandler.dispatch_cgi(self, cgi, @output)
|
102
|
-
end
|
103
|
-
|
104
|
-
def call(env)
|
105
|
-
if @@cache_classes
|
106
|
-
@app.call(env)
|
107
|
-
else
|
108
|
-
Reloader.run do
|
109
|
-
# When class reloading is turned on, we will want to rebuild the
|
110
|
-
# middleware stack every time we process a request. If we don't
|
111
|
-
# rebuild the middleware stack, then the stack may contain references
|
112
|
-
# to old classes metal classes, which will b0rk class reloading.
|
113
|
-
build_middleware_stack
|
114
|
-
@app.call(env)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def _call(env)
|
120
|
-
@env = env
|
121
|
-
dispatch
|
122
|
-
end
|
123
|
-
|
124
|
-
def flush_logger
|
125
|
-
Base.logger.flush
|
126
|
-
end
|
127
|
-
|
128
|
-
private
|
129
|
-
def build_middleware_stack
|
130
|
-
@app = @@middleware.build(lambda { |env| self.dup._call(env) })
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
module ActionController
|
4
|
-
# The Failsafe middleware is usually the top-most middleware in the Rack
|
5
|
-
# middleware chain. It returns the underlying middleware's response, but if
|
6
|
-
# the underlying middle raises an exception then Failsafe will log the
|
7
|
-
# exception into the Rails log file, and will attempt to return an error
|
8
|
-
# message response.
|
9
|
-
#
|
10
|
-
# Failsafe is a last resort for logging errors and for telling the HTTP
|
11
|
-
# client that something went wrong. Do not confuse this with the
|
12
|
-
# ActionController::Rescue module, which is responsible for catching
|
13
|
-
# exceptions at deeper levels. Unlike Failsafe, which is as simple as
|
14
|
-
# possible, Rescue provides features that allow developers to hook into
|
15
|
-
# the error handling logic, and can customize the error message response
|
16
|
-
# based on the HTTP client's IP.
|
17
|
-
class Failsafe
|
18
|
-
cattr_accessor :error_file_path
|
19
|
-
self.error_file_path = Rails.public_path if defined?(Rails.public_path)
|
20
|
-
|
21
|
-
def initialize(app)
|
22
|
-
@app = app
|
23
|
-
end
|
24
|
-
|
25
|
-
def call(env)
|
26
|
-
@app.call(env)
|
27
|
-
rescue Exception => exception
|
28
|
-
# Reraise exception in test environment
|
29
|
-
if defined?(Rails) && Rails.env.test?
|
30
|
-
raise exception
|
31
|
-
else
|
32
|
-
failsafe_response(exception)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
def failsafe_response(exception)
|
38
|
-
log_failsafe_exception(exception)
|
39
|
-
[500, {'Content-Type' => 'text/html'}, [failsafe_response_body]]
|
40
|
-
rescue Exception => failsafe_error # Logger or IO errors
|
41
|
-
$stderr.puts "Error during failsafe response: #{failsafe_error}"
|
42
|
-
end
|
43
|
-
|
44
|
-
def failsafe_response_body
|
45
|
-
error_template_path = "#{self.class.error_file_path}/500.html"
|
46
|
-
if File.exist?(error_template_path)
|
47
|
-
begin
|
48
|
-
result = render_template(error_template_path)
|
49
|
-
rescue Exception
|
50
|
-
result = nil
|
51
|
-
end
|
52
|
-
else
|
53
|
-
result = nil
|
54
|
-
end
|
55
|
-
if result.nil?
|
56
|
-
result = "<html><body><h1>500 Internal Server Error</h1>" <<
|
57
|
-
"If you are the administrator of this website, then please read this web " <<
|
58
|
-
"application's log file to find out what went wrong.</body></html>"
|
59
|
-
end
|
60
|
-
result
|
61
|
-
end
|
62
|
-
|
63
|
-
# The default 500.html uses the h() method.
|
64
|
-
def h(text) # :nodoc:
|
65
|
-
ERB::Util.h(text)
|
66
|
-
end
|
67
|
-
|
68
|
-
def render_template(filename)
|
69
|
-
ERB.new(File.read(filename)).result(binding)
|
70
|
-
end
|
71
|
-
|
72
|
-
def log_failsafe_exception(exception)
|
73
|
-
message = "/!\\ FAILSAFE /!\\ #{Time.now}\n Status: 500 Internal Server Error\n"
|
74
|
-
message << " #{exception}\n #{exception.backtrace.join("\n ")}" if exception
|
75
|
-
failsafe_logger.fatal(message)
|
76
|
-
failsafe_logger.flush if failsafe_logger.respond_to?(:flush)
|
77
|
-
end
|
78
|
-
|
79
|
-
def failsafe_logger
|
80
|
-
if defined?(Rails) && Rails.logger
|
81
|
-
Rails.logger
|
82
|
-
else
|
83
|
-
Logger.new($stderr)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
@@ -1,680 +0,0 @@
|
|
1
|
-
module ActionController #:nodoc:
|
2
|
-
module Filters #:nodoc:
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval do
|
5
|
-
extend ClassMethods
|
6
|
-
include ActionController::Filters::InstanceMethods
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class FilterChain < ActiveSupport::Callbacks::CallbackChain #:nodoc:
|
11
|
-
def append_filter_to_chain(filters, filter_type, &block)
|
12
|
-
pos = find_filter_append_position(filters, filter_type)
|
13
|
-
update_filter_chain(filters, filter_type, pos, &block)
|
14
|
-
end
|
15
|
-
|
16
|
-
def prepend_filter_to_chain(filters, filter_type, &block)
|
17
|
-
pos = find_filter_prepend_position(filters, filter_type)
|
18
|
-
update_filter_chain(filters, filter_type, pos, &block)
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_filters(filters, filter_type, &block)
|
22
|
-
filters, conditions = extract_options(filters, &block)
|
23
|
-
filters.map! { |filter| find_or_create_filter(filter, filter_type, conditions) }
|
24
|
-
filters
|
25
|
-
end
|
26
|
-
|
27
|
-
def skip_filter_in_chain(*filters, &test)
|
28
|
-
filters, conditions = extract_options(filters)
|
29
|
-
filters.each do |filter|
|
30
|
-
if callback = find(filter) then delete(callback) end
|
31
|
-
end if conditions.empty?
|
32
|
-
update_filter_in_chain(filters, :skip => conditions, &test)
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
def update_filter_chain(filters, filter_type, pos, &block)
|
37
|
-
new_filters = create_filters(filters, filter_type, &block)
|
38
|
-
insert(pos, new_filters).flatten!
|
39
|
-
end
|
40
|
-
|
41
|
-
def find_filter_append_position(filters, filter_type)
|
42
|
-
# appending an after filter puts it at the end of the call chain
|
43
|
-
# before and around filters go before the first after filter in the chain
|
44
|
-
unless filter_type == :after
|
45
|
-
each_with_index do |f,i|
|
46
|
-
return i if f.after?
|
47
|
-
end
|
48
|
-
end
|
49
|
-
return -1
|
50
|
-
end
|
51
|
-
|
52
|
-
def find_filter_prepend_position(filters, filter_type)
|
53
|
-
# prepending a before or around filter puts it at the front of the call chain
|
54
|
-
# after filters go before the first after filter in the chain
|
55
|
-
if filter_type == :after
|
56
|
-
each_with_index do |f,i|
|
57
|
-
return i if f.after?
|
58
|
-
end
|
59
|
-
return -1
|
60
|
-
end
|
61
|
-
return 0
|
62
|
-
end
|
63
|
-
|
64
|
-
def find_or_create_filter(filter, filter_type, options = {})
|
65
|
-
update_filter_in_chain([filter], options)
|
66
|
-
|
67
|
-
if found_filter = find(filter) { |f| f.type == filter_type }
|
68
|
-
found_filter
|
69
|
-
else
|
70
|
-
filter_kind = case
|
71
|
-
when filter.respond_to?(:before) && filter_type == :before
|
72
|
-
:before
|
73
|
-
when filter.respond_to?(:after) && filter_type == :after
|
74
|
-
:after
|
75
|
-
else
|
76
|
-
:filter
|
77
|
-
end
|
78
|
-
|
79
|
-
case filter_type
|
80
|
-
when :before
|
81
|
-
BeforeFilter.new(filter_kind, filter, options)
|
82
|
-
when :after
|
83
|
-
AfterFilter.new(filter_kind, filter, options)
|
84
|
-
else
|
85
|
-
AroundFilter.new(filter_kind, filter, options)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def update_filter_in_chain(filters, options, &test)
|
91
|
-
filters.map! { |f| block_given? ? find(f, &test) : find(f) }
|
92
|
-
filters.compact!
|
93
|
-
|
94
|
-
map! do |filter|
|
95
|
-
if filters.include?(filter)
|
96
|
-
new_filter = filter.dup
|
97
|
-
new_filter.update_options!(options)
|
98
|
-
new_filter
|
99
|
-
else
|
100
|
-
filter
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
class Filter < ActiveSupport::Callbacks::Callback #:nodoc:
|
107
|
-
def initialize(kind, method, options = {})
|
108
|
-
super
|
109
|
-
update_options! options
|
110
|
-
end
|
111
|
-
|
112
|
-
# override these to return true in appropriate subclass
|
113
|
-
def before?
|
114
|
-
false
|
115
|
-
end
|
116
|
-
|
117
|
-
def after?
|
118
|
-
false
|
119
|
-
end
|
120
|
-
|
121
|
-
def around?
|
122
|
-
false
|
123
|
-
end
|
124
|
-
|
125
|
-
# Make sets of strings from :only/:except options
|
126
|
-
def update_options!(other)
|
127
|
-
if other
|
128
|
-
convert_only_and_except_options_to_sets_of_strings(other)
|
129
|
-
if other[:skip]
|
130
|
-
convert_only_and_except_options_to_sets_of_strings(other[:skip])
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
options.update(other)
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
def should_not_skip?(controller)
|
139
|
-
if options[:skip]
|
140
|
-
!included_in_action?(controller, options[:skip])
|
141
|
-
else
|
142
|
-
true
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def included_in_action?(controller, options)
|
147
|
-
if options[:only]
|
148
|
-
options[:only].include?(controller.action_name)
|
149
|
-
elsif options[:except]
|
150
|
-
!options[:except].include?(controller.action_name)
|
151
|
-
else
|
152
|
-
true
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def should_run_callback?(controller)
|
157
|
-
should_not_skip?(controller) && included_in_action?(controller, options) && super
|
158
|
-
end
|
159
|
-
|
160
|
-
def convert_only_and_except_options_to_sets_of_strings(opts)
|
161
|
-
[:only, :except].each do |key|
|
162
|
-
if values = opts[key]
|
163
|
-
opts[key] = Array(values).map(&:to_s).to_set
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
class AroundFilter < Filter #:nodoc:
|
170
|
-
def type
|
171
|
-
:around
|
172
|
-
end
|
173
|
-
|
174
|
-
def around?
|
175
|
-
true
|
176
|
-
end
|
177
|
-
|
178
|
-
def call(controller, &block)
|
179
|
-
if should_run_callback?(controller)
|
180
|
-
method = filter_responds_to_before_and_after? ? around_proc : self.method
|
181
|
-
|
182
|
-
# For around_filter do |controller, action|
|
183
|
-
if method.is_a?(Proc) && method.arity == 2
|
184
|
-
evaluate_method(method, controller, block)
|
185
|
-
else
|
186
|
-
evaluate_method(method, controller, &block)
|
187
|
-
end
|
188
|
-
else
|
189
|
-
block.call
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
private
|
194
|
-
def filter_responds_to_before_and_after?
|
195
|
-
method.respond_to?(:before) && method.respond_to?(:after)
|
196
|
-
end
|
197
|
-
|
198
|
-
def around_proc
|
199
|
-
Proc.new do |controller, action|
|
200
|
-
method.before(controller)
|
201
|
-
|
202
|
-
if controller.__send__(:performed?)
|
203
|
-
controller.__send__(:halt_filter_chain, method, :rendered_or_redirected)
|
204
|
-
else
|
205
|
-
begin
|
206
|
-
action.call
|
207
|
-
ensure
|
208
|
-
method.after(controller)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
class BeforeFilter < Filter #:nodoc:
|
216
|
-
def type
|
217
|
-
:before
|
218
|
-
end
|
219
|
-
|
220
|
-
def before?
|
221
|
-
true
|
222
|
-
end
|
223
|
-
|
224
|
-
def call(controller, &block)
|
225
|
-
super
|
226
|
-
if controller.__send__(:performed?)
|
227
|
-
controller.__send__(:halt_filter_chain, method, :rendered_or_redirected)
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
class AfterFilter < Filter #:nodoc:
|
233
|
-
def type
|
234
|
-
:after
|
235
|
-
end
|
236
|
-
|
237
|
-
def after?
|
238
|
-
true
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
|
-
# Filters enable controllers to run shared pre- and post-processing code for its actions. These filters can be used to do
|
243
|
-
# authentication, caching, or auditing before the intended action is performed. Or to do localization or output
|
244
|
-
# compression after the action has been performed. Filters have access to the request, response, and all the instance
|
245
|
-
# variables set by other filters in the chain or by the action (in the case of after filters).
|
246
|
-
#
|
247
|
-
# == Filter inheritance
|
248
|
-
#
|
249
|
-
# Controller inheritance hierarchies share filters downwards, but subclasses can also add or skip filters without
|
250
|
-
# affecting the superclass. For example:
|
251
|
-
#
|
252
|
-
# class BankController < ActionController::Base
|
253
|
-
# before_filter :audit
|
254
|
-
#
|
255
|
-
# private
|
256
|
-
# def audit
|
257
|
-
# # record the action and parameters in an audit log
|
258
|
-
# end
|
259
|
-
# end
|
260
|
-
#
|
261
|
-
# class VaultController < BankController
|
262
|
-
# before_filter :verify_credentials
|
263
|
-
#
|
264
|
-
# private
|
265
|
-
# def verify_credentials
|
266
|
-
# # make sure the user is allowed into the vault
|
267
|
-
# end
|
268
|
-
# end
|
269
|
-
#
|
270
|
-
# Now any actions performed on the BankController will have the audit method called before. On the VaultController,
|
271
|
-
# first the audit method is called, then the verify_credentials method. If the audit method renders or redirects, then
|
272
|
-
# verify_credentials and the intended action are never called.
|
273
|
-
#
|
274
|
-
# == Filter types
|
275
|
-
#
|
276
|
-
# A filter can take one of three forms: method reference (symbol), external class, or inline method (proc). The first
|
277
|
-
# is the most common and works by referencing a protected or private method somewhere in the inheritance hierarchy of
|
278
|
-
# the controller by use of a symbol. In the bank example above, both BankController and VaultController use this form.
|
279
|
-
#
|
280
|
-
# Using an external class makes for more easily reused generic filters, such as output compression. External filter classes
|
281
|
-
# are implemented by having a static +filter+ method on any class and then passing this class to the filter method. Example:
|
282
|
-
#
|
283
|
-
# class OutputCompressionFilter
|
284
|
-
# def self.filter(controller)
|
285
|
-
# controller.response.body = compress(controller.response.body)
|
286
|
-
# end
|
287
|
-
# end
|
288
|
-
#
|
289
|
-
# class NewspaperController < ActionController::Base
|
290
|
-
# after_filter OutputCompressionFilter
|
291
|
-
# end
|
292
|
-
#
|
293
|
-
# The filter method is passed the controller instance and is hence granted access to all aspects of the controller and can
|
294
|
-
# manipulate them as it sees fit.
|
295
|
-
#
|
296
|
-
# The inline method (using a proc) can be used to quickly do something small that doesn't require a lot of explanation.
|
297
|
-
# Or just as a quick test. It works like this:
|
298
|
-
#
|
299
|
-
# class WeblogController < ActionController::Base
|
300
|
-
# before_filter { |controller| head(400) if controller.params["stop_action"] }
|
301
|
-
# end
|
302
|
-
#
|
303
|
-
# As you can see, the block expects to be passed the controller after it has assigned the request to the internal variables.
|
304
|
-
# This means that the block has access to both the request and response objects complete with convenience methods for params,
|
305
|
-
# session, template, and assigns. Note: The inline method doesn't strictly have to be a block; any object that responds to call
|
306
|
-
# and returns 1 or -1 on arity will do (such as a Proc or an Method object).
|
307
|
-
#
|
308
|
-
# Please note that around_filters function a little differently than the normal before and after filters with regard to filter
|
309
|
-
# types. Please see the section dedicated to around_filters below.
|
310
|
-
#
|
311
|
-
# == Filter chain ordering
|
312
|
-
#
|
313
|
-
# Using <tt>before_filter</tt> and <tt>after_filter</tt> appends the specified filters to the existing chain. That's usually
|
314
|
-
# just fine, but some times you care more about the order in which the filters are executed. When that's the case, you
|
315
|
-
# can use <tt>prepend_before_filter</tt> and <tt>prepend_after_filter</tt>. Filters added by these methods will be put at the
|
316
|
-
# beginning of their respective chain and executed before the rest. For example:
|
317
|
-
#
|
318
|
-
# class ShoppingController < ActionController::Base
|
319
|
-
# before_filter :verify_open_shop
|
320
|
-
#
|
321
|
-
# class CheckoutController < ShoppingController
|
322
|
-
# prepend_before_filter :ensure_items_in_cart, :ensure_items_in_stock
|
323
|
-
#
|
324
|
-
# The filter chain for the CheckoutController is now <tt>:ensure_items_in_cart, :ensure_items_in_stock,</tt>
|
325
|
-
# <tt>:verify_open_shop</tt>. So if either of the ensure filters renders or redirects, we'll never get around to see if the shop
|
326
|
-
# is open or not.
|
327
|
-
#
|
328
|
-
# You may pass multiple filter arguments of each type as well as a filter block.
|
329
|
-
# If a block is given, it is treated as the last argument.
|
330
|
-
#
|
331
|
-
# == Around filters
|
332
|
-
#
|
333
|
-
# Around filters wrap an action, executing code both before and after.
|
334
|
-
# They may be declared as method references, blocks, or objects responding
|
335
|
-
# to +filter+ or to both +before+ and +after+.
|
336
|
-
#
|
337
|
-
# To use a method as an +around_filter+, pass a symbol naming the Ruby method.
|
338
|
-
# Yield (or <tt>block.call</tt>) within the method to run the action.
|
339
|
-
#
|
340
|
-
# around_filter :catch_exceptions
|
341
|
-
#
|
342
|
-
# private
|
343
|
-
# def catch_exceptions
|
344
|
-
# yield
|
345
|
-
# rescue => exception
|
346
|
-
# logger.debug "Caught exception! #{exception}"
|
347
|
-
# raise
|
348
|
-
# end
|
349
|
-
#
|
350
|
-
# To use a block as an +around_filter+, pass a block taking as args both
|
351
|
-
# the controller and the action block. You can't call yield directly from
|
352
|
-
# an +around_filter+ block; explicitly call the action block instead:
|
353
|
-
#
|
354
|
-
# around_filter do |controller, action|
|
355
|
-
# logger.debug "before #{controller.action_name}"
|
356
|
-
# action.call
|
357
|
-
# logger.debug "after #{controller.action_name}"
|
358
|
-
# end
|
359
|
-
#
|
360
|
-
# To use a filter object with +around_filter+, pass an object responding
|
361
|
-
# to <tt>:filter</tt> or both <tt>:before</tt> and <tt>:after</tt>. With a
|
362
|
-
# filter method, yield to the block as above:
|
363
|
-
#
|
364
|
-
# around_filter BenchmarkingFilter
|
365
|
-
#
|
366
|
-
# class BenchmarkingFilter
|
367
|
-
# def self.filter(controller, &block)
|
368
|
-
# Benchmark.measure(&block)
|
369
|
-
# end
|
370
|
-
# end
|
371
|
-
#
|
372
|
-
# With +before+ and +after+ methods:
|
373
|
-
#
|
374
|
-
# around_filter Authorizer.new
|
375
|
-
#
|
376
|
-
# class Authorizer
|
377
|
-
# # This will run before the action. Redirecting aborts the action.
|
378
|
-
# def before(controller)
|
379
|
-
# unless user.authorized?
|
380
|
-
# redirect_to(login_url)
|
381
|
-
# end
|
382
|
-
# end
|
383
|
-
#
|
384
|
-
# # This will run after the action if and only if before did not render or redirect.
|
385
|
-
# def after(controller)
|
386
|
-
# end
|
387
|
-
# end
|
388
|
-
#
|
389
|
-
# If the filter has +before+ and +after+ methods, the +before+ method will be
|
390
|
-
# called before the action. If +before+ renders or redirects, the filter chain is
|
391
|
-
# halted and +after+ will not be run. See Filter Chain Halting below for
|
392
|
-
# an example.
|
393
|
-
#
|
394
|
-
# == Filter chain skipping
|
395
|
-
#
|
396
|
-
# Declaring a filter on a base class conveniently applies to its subclasses,
|
397
|
-
# but sometimes a subclass should skip some of its superclass' filters:
|
398
|
-
#
|
399
|
-
# class ApplicationController < ActionController::Base
|
400
|
-
# before_filter :authenticate
|
401
|
-
# around_filter :catch_exceptions
|
402
|
-
# end
|
403
|
-
#
|
404
|
-
# class WeblogController < ApplicationController
|
405
|
-
# # Will run the :authenticate and :catch_exceptions filters.
|
406
|
-
# end
|
407
|
-
#
|
408
|
-
# class SignupController < ApplicationController
|
409
|
-
# # Skip :authenticate, run :catch_exceptions.
|
410
|
-
# skip_before_filter :authenticate
|
411
|
-
# end
|
412
|
-
#
|
413
|
-
# class ProjectsController < ApplicationController
|
414
|
-
# # Skip :catch_exceptions, run :authenticate.
|
415
|
-
# skip_filter :catch_exceptions
|
416
|
-
# end
|
417
|
-
#
|
418
|
-
# class ClientsController < ApplicationController
|
419
|
-
# # Skip :catch_exceptions and :authenticate unless action is index.
|
420
|
-
# skip_filter :catch_exceptions, :authenticate, :except => :index
|
421
|
-
# end
|
422
|
-
#
|
423
|
-
# == Filter conditions
|
424
|
-
#
|
425
|
-
# Filters may be limited to specific actions by declaring the actions to
|
426
|
-
# include or exclude. Both options accept single actions
|
427
|
-
# (<tt>:only => :index</tt>) or arrays of actions
|
428
|
-
# (<tt>:except => [:foo, :bar]</tt>).
|
429
|
-
#
|
430
|
-
# class Journal < ActionController::Base
|
431
|
-
# # Require authentication for edit and delete.
|
432
|
-
# before_filter :authorize, :only => [:edit, :delete]
|
433
|
-
#
|
434
|
-
# # Passing options to a filter with a block.
|
435
|
-
# around_filter(:except => :index) do |controller, action_block|
|
436
|
-
# results = Profiler.run(&action_block)
|
437
|
-
# controller.response.sub! "</body>", "#{results}</body>"
|
438
|
-
# end
|
439
|
-
#
|
440
|
-
# private
|
441
|
-
# def authorize
|
442
|
-
# # Redirect to login unless authenticated.
|
443
|
-
# end
|
444
|
-
# end
|
445
|
-
#
|
446
|
-
# == Filter Chain Halting
|
447
|
-
#
|
448
|
-
# <tt>before_filter</tt> and <tt>around_filter</tt> may halt the request
|
449
|
-
# before a controller action is run. This is useful, for example, to deny
|
450
|
-
# access to unauthenticated users or to redirect from HTTP to HTTPS.
|
451
|
-
# Simply call render or redirect. After filters will not be executed if the filter
|
452
|
-
# chain is halted.
|
453
|
-
#
|
454
|
-
# Around filters halt the request unless the action block is called.
|
455
|
-
# Given these filters
|
456
|
-
# after_filter :after
|
457
|
-
# around_filter :around
|
458
|
-
# before_filter :before
|
459
|
-
#
|
460
|
-
# The filter chain will look like:
|
461
|
-
#
|
462
|
-
# ...
|
463
|
-
# . \
|
464
|
-
# . #around (code before yield)
|
465
|
-
# . . \
|
466
|
-
# . . #before (actual filter code is run)
|
467
|
-
# . . . \
|
468
|
-
# . . . execute controller action
|
469
|
-
# . . . /
|
470
|
-
# . . ...
|
471
|
-
# . . /
|
472
|
-
# . #around (code after yield)
|
473
|
-
# . /
|
474
|
-
# #after (actual filter code is run, unless the around filter does not yield)
|
475
|
-
#
|
476
|
-
# If +around+ returns before yielding, +after+ will still not be run. The +before+
|
477
|
-
# filter and controller action will not be run. If +before+ renders or redirects,
|
478
|
-
# the second half of +around+ and will still run but +after+ and the
|
479
|
-
# action will not. If +around+ fails to yield, +after+ will not be run.
|
480
|
-
module ClassMethods
|
481
|
-
# The passed <tt>filters</tt> will be appended to the filter_chain and
|
482
|
-
# will execute before the action on this controller is performed.
|
483
|
-
def append_before_filter(*filters, &block)
|
484
|
-
filter_chain.append_filter_to_chain(filters, :before, &block)
|
485
|
-
end
|
486
|
-
|
487
|
-
# The passed <tt>filters</tt> will be prepended to the filter_chain and
|
488
|
-
# will execute before the action on this controller is performed.
|
489
|
-
def prepend_before_filter(*filters, &block)
|
490
|
-
filter_chain.prepend_filter_to_chain(filters, :before, &block)
|
491
|
-
end
|
492
|
-
|
493
|
-
# Shorthand for append_before_filter since it's the most common.
|
494
|
-
alias :before_filter :append_before_filter
|
495
|
-
|
496
|
-
# The passed <tt>filters</tt> will be appended to the array of filters
|
497
|
-
# that run _after_ actions on this controller are performed.
|
498
|
-
def append_after_filter(*filters, &block)
|
499
|
-
filter_chain.append_filter_to_chain(filters, :after, &block)
|
500
|
-
end
|
501
|
-
|
502
|
-
# The passed <tt>filters</tt> will be prepended to the array of filters
|
503
|
-
# that run _after_ actions on this controller are performed.
|
504
|
-
def prepend_after_filter(*filters, &block)
|
505
|
-
filter_chain.prepend_filter_to_chain(filters, :after, &block)
|
506
|
-
end
|
507
|
-
|
508
|
-
# Shorthand for append_after_filter since it's the most common.
|
509
|
-
alias :after_filter :append_after_filter
|
510
|
-
|
511
|
-
# If you <tt>append_around_filter A.new, B.new</tt>, the filter chain looks like
|
512
|
-
#
|
513
|
-
# B#before
|
514
|
-
# A#before
|
515
|
-
# # run the action
|
516
|
-
# A#after
|
517
|
-
# B#after
|
518
|
-
#
|
519
|
-
# With around filters which yield to the action block, +before+ and +after+
|
520
|
-
# are the code before and after the yield.
|
521
|
-
def append_around_filter(*filters, &block)
|
522
|
-
filter_chain.append_filter_to_chain(filters, :around, &block)
|
523
|
-
end
|
524
|
-
|
525
|
-
# If you <tt>prepend_around_filter A.new, B.new</tt>, the filter chain looks like:
|
526
|
-
#
|
527
|
-
# A#before
|
528
|
-
# B#before
|
529
|
-
# # run the action
|
530
|
-
# B#after
|
531
|
-
# A#after
|
532
|
-
#
|
533
|
-
# With around filters which yield to the action block, +before+ and +after+
|
534
|
-
# are the code before and after the yield.
|
535
|
-
def prepend_around_filter(*filters, &block)
|
536
|
-
filter_chain.prepend_filter_to_chain(filters, :around, &block)
|
537
|
-
end
|
538
|
-
|
539
|
-
# Shorthand for +append_around_filter+ since it's the most common.
|
540
|
-
alias :around_filter :append_around_filter
|
541
|
-
|
542
|
-
# Removes the specified filters from the +before+ filter chain. Note that this only works for skipping method-reference
|
543
|
-
# filters, not procs. This is especially useful for managing the chain in inheritance hierarchies where only one out
|
544
|
-
# of many sub-controllers need a different hierarchy.
|
545
|
-
#
|
546
|
-
# You can control the actions to skip the filter for with the <tt>:only</tt> and <tt>:except</tt> options,
|
547
|
-
# just like when you apply the filters.
|
548
|
-
def skip_before_filter(*filters)
|
549
|
-
filter_chain.skip_filter_in_chain(*filters, &:before?)
|
550
|
-
end
|
551
|
-
|
552
|
-
# Removes the specified filters from the +after+ filter chain. Note that this only works for skipping method-reference
|
553
|
-
# filters, not procs. This is especially useful for managing the chain in inheritance hierarchies where only one out
|
554
|
-
# of many sub-controllers need a different hierarchy.
|
555
|
-
#
|
556
|
-
# You can control the actions to skip the filter for with the <tt>:only</tt> and <tt>:except</tt> options,
|
557
|
-
# just like when you apply the filters.
|
558
|
-
def skip_after_filter(*filters)
|
559
|
-
filter_chain.skip_filter_in_chain(*filters, &:after?)
|
560
|
-
end
|
561
|
-
|
562
|
-
# Removes the specified filters from the filter chain. This only works for method reference (symbol)
|
563
|
-
# filters, not procs. This method is different from skip_after_filter and skip_before_filter in that
|
564
|
-
# it will match any before, after or yielding around filter.
|
565
|
-
#
|
566
|
-
# You can control the actions to skip the filter for with the <tt>:only</tt> and <tt>:except</tt> options,
|
567
|
-
# just like when you apply the filters.
|
568
|
-
def skip_filter(*filters)
|
569
|
-
filter_chain.skip_filter_in_chain(*filters)
|
570
|
-
end
|
571
|
-
|
572
|
-
# Returns an array of Filter objects for this controller.
|
573
|
-
def filter_chain
|
574
|
-
if chain = read_inheritable_attribute('filter_chain')
|
575
|
-
return chain
|
576
|
-
else
|
577
|
-
write_inheritable_attribute('filter_chain', FilterChain.new)
|
578
|
-
return filter_chain
|
579
|
-
end
|
580
|
-
end
|
581
|
-
|
582
|
-
# Returns all the before filters for this class and all its ancestors.
|
583
|
-
# This method returns the actual filter that was assigned in the controller to maintain existing functionality.
|
584
|
-
def before_filters #:nodoc:
|
585
|
-
filter_chain.select(&:before?).map(&:method)
|
586
|
-
end
|
587
|
-
|
588
|
-
# Returns all the after filters for this class and all its ancestors.
|
589
|
-
# This method returns the actual filter that was assigned in the controller to maintain existing functionality.
|
590
|
-
def after_filters #:nodoc:
|
591
|
-
filter_chain.select(&:after?).map(&:method)
|
592
|
-
end
|
593
|
-
end
|
594
|
-
|
595
|
-
module InstanceMethods # :nodoc:
|
596
|
-
def self.included(base)
|
597
|
-
base.class_eval do
|
598
|
-
alias_method_chain :perform_action, :filters
|
599
|
-
alias_method_chain :process, :filters
|
600
|
-
end
|
601
|
-
end
|
602
|
-
|
603
|
-
protected
|
604
|
-
def process_with_filters(request, response, method = :perform_action, *arguments) #:nodoc:
|
605
|
-
@before_filter_chain_aborted = false
|
606
|
-
process_without_filters(request, response, method, *arguments)
|
607
|
-
end
|
608
|
-
|
609
|
-
def perform_action_with_filters
|
610
|
-
call_filters(self.class.filter_chain, 0, 0)
|
611
|
-
end
|
612
|
-
|
613
|
-
private
|
614
|
-
def call_filters(chain, index, nesting)
|
615
|
-
index = run_before_filters(chain, index, nesting)
|
616
|
-
aborted = @before_filter_chain_aborted
|
617
|
-
perform_action_without_filters unless performed? || aborted
|
618
|
-
return index if nesting != 0 || aborted
|
619
|
-
run_after_filters(chain, index)
|
620
|
-
end
|
621
|
-
|
622
|
-
def run_before_filters(chain, index, nesting)
|
623
|
-
while chain[index]
|
624
|
-
filter, index = chain[index], index
|
625
|
-
break unless filter # end of call chain reached
|
626
|
-
|
627
|
-
case filter
|
628
|
-
when BeforeFilter
|
629
|
-
filter.call(self) # invoke before filter
|
630
|
-
index = index.next
|
631
|
-
break if @before_filter_chain_aborted
|
632
|
-
when AroundFilter
|
633
|
-
yielded = false
|
634
|
-
|
635
|
-
filter.call(self) do
|
636
|
-
yielded = true
|
637
|
-
# all remaining before and around filters will be run in this call
|
638
|
-
index = call_filters(chain, index.next, nesting.next)
|
639
|
-
end
|
640
|
-
|
641
|
-
halt_filter_chain(filter, :did_not_yield) unless yielded
|
642
|
-
|
643
|
-
break
|
644
|
-
else
|
645
|
-
break # no before or around filters left
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
index
|
650
|
-
end
|
651
|
-
|
652
|
-
def run_after_filters(chain, index)
|
653
|
-
seen_after_filter = false
|
654
|
-
|
655
|
-
while chain[index]
|
656
|
-
filter, index = chain[index], index
|
657
|
-
break unless filter # end of call chain reached
|
658
|
-
|
659
|
-
case filter
|
660
|
-
when AfterFilter
|
661
|
-
seen_after_filter = true
|
662
|
-
filter.call(self) # invoke after filter
|
663
|
-
else
|
664
|
-
# implementation error or someone has mucked with the filter chain
|
665
|
-
raise ActionControllerError, "filter #{filter.inspect} was in the wrong place!" if seen_after_filter
|
666
|
-
end
|
667
|
-
|
668
|
-
index = index.next
|
669
|
-
end
|
670
|
-
|
671
|
-
index.next
|
672
|
-
end
|
673
|
-
|
674
|
-
def halt_filter_chain(filter, reason)
|
675
|
-
@before_filter_chain_aborted = true
|
676
|
-
logger.info "Filter chain halted as [#{filter.inspect}] #{reason}." if logger
|
677
|
-
end
|
678
|
-
end
|
679
|
-
end
|
680
|
-
end
|