actionpack 2.3.18 → 3.0.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
module ActionController
|
|
2
|
+
module Rendering
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
include AbstractController::Rendering
|
|
7
|
+
include AbstractController::LocalizedCache
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def process_action(*)
|
|
11
|
+
self.formats = request.formats.map {|x| x.to_sym}
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def render(*args)
|
|
16
|
+
if response_body
|
|
17
|
+
raise ::AbstractController::DoubleRenderError
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
args << {} unless args.last.is_a?(Hash)
|
|
21
|
+
super(*args)
|
|
22
|
+
self.content_type ||= args.last[:_template].mime_type.to_s
|
|
23
|
+
response_body
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def render_to_body(options)
|
|
27
|
+
_process_options(options)
|
|
28
|
+
super
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def _render_partial(options)
|
|
34
|
+
options[:partial] = action_name if options[:partial] == true
|
|
35
|
+
options[:_details] = {:formats => formats}
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def format_for_text
|
|
40
|
+
formats.first
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def _process_options(options)
|
|
44
|
+
status, content_type, location = options.values_at(:status, :content_type, :location)
|
|
45
|
+
self.status = status if status
|
|
46
|
+
self.content_type = content_type if content_type
|
|
47
|
+
self.headers["Location"] = url_for(location) if location
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def _normalize_options(action=nil, options={}, &blk)
|
|
51
|
+
case action
|
|
52
|
+
when NilClass
|
|
53
|
+
when Hash
|
|
54
|
+
options = super(action.delete(:action), action)
|
|
55
|
+
when String, Symbol
|
|
56
|
+
options = super
|
|
57
|
+
else
|
|
58
|
+
options.merge! :partial => action
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
if options[:status]
|
|
62
|
+
options[:status] = Rack::Utils.status_code(options[:status])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
options[:update] = blk if block_given?
|
|
66
|
+
options
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
require 'active_support/core_ext/class/attribute'
|
|
2
|
+
|
|
3
|
+
module ActionController #:nodoc:
|
|
4
|
+
class InvalidAuthenticityToken < ActionControllerError #:nodoc:
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module RequestForgeryProtection
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
include AbstractController::Helpers
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
# Sets the token parameter name for RequestForgery. Calling +protect_from_forgery+
|
|
14
|
+
# sets it to <tt>:authenticity_token</tt> by default.
|
|
15
|
+
cattr_accessor :request_forgery_protection_token
|
|
16
|
+
|
|
17
|
+
# Controls whether request forgergy protection is turned on or not. Turned off by default only in test mode.
|
|
18
|
+
class_attribute :allow_forgery_protection
|
|
19
|
+
self.allow_forgery_protection = true
|
|
20
|
+
|
|
21
|
+
helper_method :form_authenticity_token
|
|
22
|
+
helper_method :protect_against_forgery?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Protecting controller actions from CSRF attacks by ensuring that all forms are coming from the current
|
|
26
|
+
# web application, not a forged link from another site, is done by embedding a token based on a random
|
|
27
|
+
# string stored in the session (which an attacker wouldn't know) in all forms and Ajax requests generated
|
|
28
|
+
# by Rails and then verifying the authenticity of that token in the controller. Only HTML/JavaScript
|
|
29
|
+
# requests are checked, so this will not protect your XML API (presumably you'll have a different
|
|
30
|
+
# authentication scheme there anyway). Also, GET requests are not protected as these should be
|
|
31
|
+
# idempotent anyway.
|
|
32
|
+
#
|
|
33
|
+
# This is turned on with the <tt>protect_from_forgery</tt> method, which will check the token and raise an
|
|
34
|
+
# ActionController::InvalidAuthenticityToken if it doesn't match what was expected. You can customize the
|
|
35
|
+
# error message in production by editing public/422.html. A call to this method in ApplicationController is
|
|
36
|
+
# generated by default in post-Rails 2.0 applications.
|
|
37
|
+
#
|
|
38
|
+
# The token parameter is named <tt>authenticity_token</tt> by default. If you are generating an HTML form
|
|
39
|
+
# manually (without the use of Rails' <tt>form_for</tt>, <tt>form_tag</tt> or other helpers), you have to
|
|
40
|
+
# include a hidden field named like that and set its value to what is returned by
|
|
41
|
+
# <tt>form_authenticity_token</tt>.
|
|
42
|
+
#
|
|
43
|
+
# Request forgery protection is disabled by default in test environment. If you are upgrading from Rails
|
|
44
|
+
# 1.x, add this to config/environments/test.rb:
|
|
45
|
+
#
|
|
46
|
+
# # Disable request forgery protection in test environment
|
|
47
|
+
# config.action_controller.allow_forgery_protection = false
|
|
48
|
+
#
|
|
49
|
+
# == Learn more about CSRF (Cross-Site Request Forgery) attacks
|
|
50
|
+
#
|
|
51
|
+
# Here are some resources:
|
|
52
|
+
# * http://isc.sans.org/diary.html?storyid=1750
|
|
53
|
+
# * http://en.wikipedia.org/wiki/Cross-site_request_forgery
|
|
54
|
+
#
|
|
55
|
+
# Keep in mind, this is NOT a silver-bullet, plug 'n' play, warm security blanket for your rails application.
|
|
56
|
+
# There are a few guidelines you should follow:
|
|
57
|
+
#
|
|
58
|
+
# * Keep your GET requests safe and idempotent. More reading material:
|
|
59
|
+
# * http://www.xml.com/pub/a/2002/04/24/deviant.html
|
|
60
|
+
# * http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
|
|
61
|
+
# * Make sure the session cookies that Rails creates are non-persistent. Check in Firefox and look
|
|
62
|
+
# for "Expires: at end of session"
|
|
63
|
+
#
|
|
64
|
+
module ClassMethods
|
|
65
|
+
# Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked.
|
|
66
|
+
#
|
|
67
|
+
# Example:
|
|
68
|
+
#
|
|
69
|
+
# class FooController < ApplicationController
|
|
70
|
+
# protect_from_forgery :except => :index
|
|
71
|
+
#
|
|
72
|
+
# # you can disable csrf protection on controller-by-controller basis:
|
|
73
|
+
# skip_before_filter :verify_authenticity_token
|
|
74
|
+
# end
|
|
75
|
+
#
|
|
76
|
+
# Valid Options:
|
|
77
|
+
#
|
|
78
|
+
# * <tt>:only/:except</tt> - Passed to the <tt>before_filter</tt> call. Set which actions are verified.
|
|
79
|
+
def protect_from_forgery(options = {})
|
|
80
|
+
self.request_forgery_protection_token ||= :authenticity_token
|
|
81
|
+
before_filter :verify_authenticity_token, options
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
protected
|
|
86
|
+
# The actual before_filter that is used. Modify this to change how you handle unverified requests.
|
|
87
|
+
def verify_authenticity_token
|
|
88
|
+
verified_request? || raise(ActionController::InvalidAuthenticityToken)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Returns true or false if a request is verified. Checks:
|
|
92
|
+
#
|
|
93
|
+
# * is the format restricted? By default, only HTML requests are checked.
|
|
94
|
+
# * is it a GET request? Gets should be safe and idempotent
|
|
95
|
+
# * Does the form_authenticity_token match the given token value from the params?
|
|
96
|
+
def verified_request?
|
|
97
|
+
!protect_against_forgery? || request.forgery_whitelisted? ||
|
|
98
|
+
form_authenticity_token == params[request_forgery_protection_token]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Sets the token value for the current session.
|
|
102
|
+
def form_authenticity_token
|
|
103
|
+
session[:_csrf_token] ||= ActiveSupport::SecureRandom.base64(32)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# The form's authenticity parameter. Override to provide your own.
|
|
107
|
+
def form_authenticity_param
|
|
108
|
+
params[request_forgery_protection_token]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def protect_against_forgery?
|
|
112
|
+
self.class.allow_forgery_protection
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module ActionController #:nodoc:
|
|
2
|
+
module Rescue
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
include ActiveSupport::Rescuable
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
def process_action(*args)
|
|
8
|
+
super
|
|
9
|
+
rescue Exception => exception
|
|
10
|
+
rescue_with_handler(exception) || raise(exception)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
module ActionController #:nodoc:
|
|
2
|
+
# Responder is responsible for exposing a resource to different mime requests,
|
|
3
|
+
# usually depending on the HTTP verb. The responder is triggered when
|
|
4
|
+
# <code>respond_with</code> is called. The simplest case to study is a GET request:
|
|
5
|
+
#
|
|
6
|
+
# class PeopleController < ApplicationController
|
|
7
|
+
# respond_to :html, :xml, :json
|
|
8
|
+
#
|
|
9
|
+
# def index
|
|
10
|
+
# @people = Person.find(:all)
|
|
11
|
+
# respond_with(@people)
|
|
12
|
+
# end
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
# When a request comes in, for example for an XML response, three steps happen:
|
|
16
|
+
#
|
|
17
|
+
# 1) the responder searches for a template at people/index.xml;
|
|
18
|
+
#
|
|
19
|
+
# 2) if the template is not available, it will invoke <code>#to_xml</code> on the given resource;
|
|
20
|
+
#
|
|
21
|
+
# 3) if the responder does not <code>respond_to :to_xml</code>, call <code>#to_format</code> on it.
|
|
22
|
+
#
|
|
23
|
+
# === Builtin HTTP verb semantics
|
|
24
|
+
#
|
|
25
|
+
# The default Rails responder holds semantics for each HTTP verb. Depending on the
|
|
26
|
+
# content type, verb and the resource status, it will behave differently.
|
|
27
|
+
#
|
|
28
|
+
# Using Rails default responder, a POST request for creating an object could
|
|
29
|
+
# be written as:
|
|
30
|
+
#
|
|
31
|
+
# def create
|
|
32
|
+
# @user = User.new(params[:user])
|
|
33
|
+
# flash[:notice] = 'User was successfully created.' if @user.save
|
|
34
|
+
# respond_with(@user)
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
37
|
+
# Which is exactly the same as:
|
|
38
|
+
#
|
|
39
|
+
# def create
|
|
40
|
+
# @user = User.new(params[:user])
|
|
41
|
+
#
|
|
42
|
+
# respond_to do |format|
|
|
43
|
+
# if @user.save
|
|
44
|
+
# flash[:notice] = 'User was successfully created.'
|
|
45
|
+
# format.html { redirect_to(@user) }
|
|
46
|
+
# format.xml { render :xml => @user, :status => :created, :location => @user }
|
|
47
|
+
# else
|
|
48
|
+
# format.html { render :action => "new" }
|
|
49
|
+
# format.xml { render :xml => @user.errors, :status => :unprocessable_entity }
|
|
50
|
+
# end
|
|
51
|
+
# end
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# The same happens for PUT and DELETE requests.
|
|
55
|
+
#
|
|
56
|
+
# === Nested resources
|
|
57
|
+
#
|
|
58
|
+
# You can supply nested resources as you do in <code>form_for</code> and <code>polymorphic_url</code>.
|
|
59
|
+
# Consider the project has many tasks example. The create action for
|
|
60
|
+
# TasksController would be like:
|
|
61
|
+
#
|
|
62
|
+
# def create
|
|
63
|
+
# @project = Project.find(params[:project_id])
|
|
64
|
+
# @task = @project.comments.build(params[:task])
|
|
65
|
+
# flash[:notice] = 'Task was successfully created.' if @task.save
|
|
66
|
+
# respond_with(@project, @task)
|
|
67
|
+
# end
|
|
68
|
+
#
|
|
69
|
+
# Giving an array of resources, you ensure that the responder will redirect to
|
|
70
|
+
# <code>project_task_url</code> instead of <code>task_url</code>.
|
|
71
|
+
#
|
|
72
|
+
# Namespaced and singleton resources require a symbol to be given, as in
|
|
73
|
+
# polymorphic urls. If a project has one manager which has many tasks, it
|
|
74
|
+
# should be invoked as:
|
|
75
|
+
#
|
|
76
|
+
# respond_with(@project, :manager, @task)
|
|
77
|
+
#
|
|
78
|
+
# Check <code>polymorphic_url</code> documentation for more examples.
|
|
79
|
+
#
|
|
80
|
+
class Responder
|
|
81
|
+
attr_reader :controller, :request, :format, :resource, :resources, :options
|
|
82
|
+
|
|
83
|
+
ACTIONS_FOR_VERBS = {
|
|
84
|
+
:post => :new,
|
|
85
|
+
:put => :edit
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
def initialize(controller, resources, options={})
|
|
89
|
+
@controller = controller
|
|
90
|
+
@request = controller.request
|
|
91
|
+
@format = controller.formats.first
|
|
92
|
+
@resource = resources.is_a?(Array) ? resources.last : resources
|
|
93
|
+
@resources = resources
|
|
94
|
+
@options = options
|
|
95
|
+
@action = options.delete(:action)
|
|
96
|
+
@default_response = options.delete(:default_response)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
delegate :head, :render, :redirect_to, :to => :controller
|
|
100
|
+
delegate :get?, :post?, :put?, :delete?, :to => :request
|
|
101
|
+
|
|
102
|
+
# Undefine :to_json and :to_yaml since it's defined on Object
|
|
103
|
+
undef_method(:to_json) if method_defined?(:to_json)
|
|
104
|
+
undef_method(:to_yaml) if method_defined?(:to_yaml)
|
|
105
|
+
|
|
106
|
+
# Initializes a new responder an invoke the proper format. If the format is
|
|
107
|
+
# not defined, call to_format.
|
|
108
|
+
#
|
|
109
|
+
def self.call(*args)
|
|
110
|
+
new(*args).respond
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Main entry point for responder responsible to dispatch to the proper format.
|
|
114
|
+
#
|
|
115
|
+
def respond
|
|
116
|
+
method = :"to_#{format}"
|
|
117
|
+
respond_to?(method) ? send(method) : to_format
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# HTML format does not render the resource, it always attempt to render a
|
|
121
|
+
# template.
|
|
122
|
+
#
|
|
123
|
+
def to_html
|
|
124
|
+
default_render
|
|
125
|
+
rescue ActionView::MissingTemplate => e
|
|
126
|
+
navigation_behavior(e)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# All other formats follow the procedure below. First we try to render a
|
|
130
|
+
# template, if the template is not available, we verify if the resource
|
|
131
|
+
# responds to :to_format and display it.
|
|
132
|
+
#
|
|
133
|
+
def to_format
|
|
134
|
+
default_render
|
|
135
|
+
rescue ActionView::MissingTemplate => e
|
|
136
|
+
raise unless resourceful?
|
|
137
|
+
api_behavior(e)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
protected
|
|
141
|
+
|
|
142
|
+
# This is the common behavior for "navigation" requests, like :html, :iphone and so forth.
|
|
143
|
+
def navigation_behavior(error)
|
|
144
|
+
if get?
|
|
145
|
+
raise error
|
|
146
|
+
elsif has_errors? && default_action
|
|
147
|
+
render :action => default_action
|
|
148
|
+
else
|
|
149
|
+
redirect_to resource_location
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# This is the common behavior for "API" requests, like :xml and :json.
|
|
154
|
+
def api_behavior(error)
|
|
155
|
+
if get?
|
|
156
|
+
display resource
|
|
157
|
+
elsif has_errors?
|
|
158
|
+
display resource.errors, :status => :unprocessable_entity
|
|
159
|
+
elsif post?
|
|
160
|
+
display resource, :status => :created, :location => resource_location
|
|
161
|
+
else
|
|
162
|
+
head :ok
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Checks whether the resource responds to the current format or not.
|
|
167
|
+
#
|
|
168
|
+
def resourceful?
|
|
169
|
+
resource.respond_to?(:"to_#{format}")
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Returns the resource location by retrieving it from the options or
|
|
173
|
+
# returning the resources array.
|
|
174
|
+
#
|
|
175
|
+
def resource_location
|
|
176
|
+
options[:location] || resources
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# If a given response block was given, use it, otherwise call render on
|
|
180
|
+
# controller.
|
|
181
|
+
#
|
|
182
|
+
def default_render
|
|
183
|
+
@default_response.call
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Display is just a shortcut to render a resource with the current format.
|
|
187
|
+
#
|
|
188
|
+
# display @user, :status => :ok
|
|
189
|
+
#
|
|
190
|
+
# For XML requests it's equivalent to:
|
|
191
|
+
#
|
|
192
|
+
# render :xml => @user, :status => :ok
|
|
193
|
+
#
|
|
194
|
+
# Options sent by the user are also used:
|
|
195
|
+
#
|
|
196
|
+
# respond_with(@user, :status => :created)
|
|
197
|
+
# display(@user, :status => :ok)
|
|
198
|
+
#
|
|
199
|
+
# Results in:
|
|
200
|
+
#
|
|
201
|
+
# render :xml => @user, :status => :created
|
|
202
|
+
#
|
|
203
|
+
def display(resource, given_options={})
|
|
204
|
+
controller.render given_options.merge!(options).merge!(format => resource)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Check whether the resource has errors.
|
|
208
|
+
#
|
|
209
|
+
def has_errors?
|
|
210
|
+
resource.respond_to?(:errors) && !resource.errors.empty?
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# By default, render the <code>:edit</code> action for HTML requests with failure, unless
|
|
214
|
+
# the verb is POST.
|
|
215
|
+
#
|
|
216
|
+
def default_action
|
|
217
|
+
@action ||= ACTIONS_FOR_VERBS[request.method]
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
module ActionController #:nodoc:
|
|
2
2
|
module SessionManagement #:nodoc:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
end
|
|
7
|
-
end
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
include ActionController::Configuration
|
|
8
6
|
|
|
9
7
|
module ClassMethods
|
|
10
8
|
# Set the session store to be used for keeping the session data between requests.
|
|
@@ -16,7 +14,7 @@ module ActionController #:nodoc:
|
|
|
16
14
|
self.session_store = ActiveRecord::SessionStore
|
|
17
15
|
else
|
|
18
16
|
@@session_store = store.is_a?(Symbol) ?
|
|
19
|
-
Session.const_get(store.to_s.camelize) :
|
|
17
|
+
ActionDispatch::Session.const_get(store.to_s.camelize) :
|
|
20
18
|
store
|
|
21
19
|
end
|
|
22
20
|
end
|
|
@@ -26,7 +24,7 @@ module ActionController #:nodoc:
|
|
|
26
24
|
if defined? @@session_store
|
|
27
25
|
@@session_store
|
|
28
26
|
else
|
|
29
|
-
Session::CookieStore
|
|
27
|
+
ActionDispatch::Session::CookieStore
|
|
30
28
|
end
|
|
31
29
|
end
|
|
32
30
|
|
|
@@ -35,13 +33,6 @@ module ActionController #:nodoc:
|
|
|
35
33
|
session_options.merge!(options)
|
|
36
34
|
end
|
|
37
35
|
|
|
38
|
-
# Returns the hash used to configure the session. Example use:
|
|
39
|
-
#
|
|
40
|
-
# ActionController::Base.session_options[:secure] = true # session only available over HTTPS
|
|
41
|
-
def session_options
|
|
42
|
-
@session_options ||= {}
|
|
43
|
-
end
|
|
44
|
-
|
|
45
36
|
def session(*args)
|
|
46
37
|
ActiveSupport::Deprecation.warn(
|
|
47
38
|
"Disabling sessions for a single controller has been deprecated. " +
|