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
@@ -0,0 +1,44 @@
|
|
1
|
+
module ActionView
|
2
|
+
module CompiledTemplates #:nodoc:
|
3
|
+
# holds compiled template code
|
4
|
+
end
|
5
|
+
|
6
|
+
# ActionView contexts are supplied to ActionController
|
7
|
+
# to render template. The default ActionView context
|
8
|
+
# is ActionView::Base.
|
9
|
+
#
|
10
|
+
# In order to work with ActionController, a Context
|
11
|
+
# must implement:
|
12
|
+
#
|
13
|
+
# Context.for_controller[controller] Create a new ActionView instance for a
|
14
|
+
# controller
|
15
|
+
# Context#render_partial[options]
|
16
|
+
# - responsible for setting options[:_template]
|
17
|
+
# - Returns String with the rendered partial
|
18
|
+
# options<Hash>:: see _render_partial in ActionView::Base
|
19
|
+
# Context#render_template[template, layout, options, partial]
|
20
|
+
# - Returns String with the rendered template
|
21
|
+
# template<ActionView::Template>:: The template to render
|
22
|
+
# layout<ActionView::Template>:: The layout to render around the template
|
23
|
+
# options<Hash>:: See _render_template_with_layout in ActionView::Base
|
24
|
+
# partial<Boolean>:: Whether or not the template to render is a partial
|
25
|
+
#
|
26
|
+
# An ActionView context can also mix in ActionView's
|
27
|
+
# helpers. In order to mix in helpers, a context must
|
28
|
+
# implement:
|
29
|
+
#
|
30
|
+
# Context#controller
|
31
|
+
# - Returns an instance of AbstractController
|
32
|
+
#
|
33
|
+
# In any case, a context must mix in ActionView::Context,
|
34
|
+
# which stores compiled template and provides the output
|
35
|
+
# buffer.
|
36
|
+
module Context
|
37
|
+
include CompiledTemplates
|
38
|
+
attr_accessor :output_buffer
|
39
|
+
|
40
|
+
def convert_to_model(object)
|
41
|
+
object.respond_to?(:to_model) ? object.to_model : object
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/action_view/helpers.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
+
require 'active_support/benchmarkable'
|
2
|
+
|
1
3
|
module ActionView #:nodoc:
|
2
4
|
module Helpers #:nodoc:
|
3
|
-
autoload :
|
5
|
+
autoload :ActiveModelHelper, 'action_view/helpers/active_model_helper'
|
4
6
|
autoload :AssetTagHelper, 'action_view/helpers/asset_tag_helper'
|
5
7
|
autoload :AtomFeedHelper, 'action_view/helpers/atom_feed_helper'
|
6
|
-
autoload :BenchmarkHelper, 'action_view/helpers/benchmark_helper'
|
7
8
|
autoload :CacheHelper, 'action_view/helpers/cache_helper'
|
8
9
|
autoload :CaptureHelper, 'action_view/helpers/capture_helper'
|
9
10
|
autoload :CsrfHelper, 'action_view/helpers/csrf_helper'
|
@@ -33,10 +34,11 @@ module ActionView #:nodoc:
|
|
33
34
|
include SanitizeHelper::ClassMethods
|
34
35
|
end
|
35
36
|
|
36
|
-
include
|
37
|
+
include ActiveSupport::Benchmarkable
|
38
|
+
|
39
|
+
include ActiveModelHelper
|
37
40
|
include AssetTagHelper
|
38
41
|
include AtomFeedHelper
|
39
|
-
include BenchmarkHelper
|
40
42
|
include CacheHelper
|
41
43
|
include CaptureHelper
|
42
44
|
include CsrfHelper
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'action_view/helpers/form_helper'
|
3
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
4
|
+
require 'active_support/core_ext/enumerable'
|
5
|
+
require 'active_support/core_ext/kernel/reporting'
|
3
6
|
|
4
7
|
module ActionView
|
5
8
|
class Base
|
@@ -12,7 +15,7 @@ module ActionView
|
|
12
15
|
# method that creates a complete form for all the basic content types of the record (not associations or aggregations, though). This
|
13
16
|
# is a great way of making the record quickly available for editing, but likely to prove lackluster for a complicated real-world form.
|
14
17
|
# In that case, it's better to use the +input+ method and the specialized +form+ methods in link:classes/ActionView/Helpers/FormHelper.html
|
15
|
-
module
|
18
|
+
module ActiveModelHelper
|
16
19
|
# Returns a default input tag for the type of object returned by the method. For example, if <tt>@post</tt>
|
17
20
|
# has an attribute +title+ mapped to a +VARCHAR+ column that holds "Hello World":
|
18
21
|
#
|
@@ -74,6 +77,7 @@ module ActionView
|
|
74
77
|
# * <tt>:submit_value</tt> - The text of the submit button (default: "Create" if a new record, otherwise "Update").
|
75
78
|
def form(record_name, options = {})
|
76
79
|
record = instance_variable_get("@#{record_name}")
|
80
|
+
record = convert_to_model(record)
|
77
81
|
|
78
82
|
options = options.symbolize_keys
|
79
83
|
options[:action] ||= record.new_record? ? "create" : "update"
|
@@ -86,7 +90,7 @@ module ActionView
|
|
86
90
|
contents.safe_concat all_input_tags(record, record_name, options)
|
87
91
|
yield contents if block_given?
|
88
92
|
contents.safe_concat submit_tag(submit_value)
|
89
|
-
contents.safe_concat
|
93
|
+
contents.safe_concat('</form>')
|
90
94
|
end
|
91
95
|
|
92
96
|
# Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
|
@@ -118,10 +122,12 @@ module ActionView
|
|
118
122
|
end
|
119
123
|
options.reverse_merge!(:prepend_text => '', :append_text => '', :css_class => 'formError')
|
120
124
|
|
125
|
+
object = convert_to_model(object)
|
126
|
+
|
121
127
|
if (obj = (object.respond_to?(:errors) ? object : instance_variable_get("@#{object}"))) &&
|
122
|
-
(errors = obj.errors
|
128
|
+
(errors = obj.errors[method])
|
123
129
|
content_tag("div",
|
124
|
-
"#{options[:prepend_text]}#{ERB::Util.html_escape(errors.
|
130
|
+
"#{options[:prepend_text]}#{ERB::Util.html_escape(errors.first)}#{options[:append_text]}",
|
125
131
|
:class => options[:css_class]
|
126
132
|
)
|
127
133
|
else
|
@@ -154,11 +160,24 @@ module ActionView
|
|
154
160
|
#
|
155
161
|
# error_messages_for 'user'
|
156
162
|
#
|
163
|
+
# You can also supply an object:
|
164
|
+
#
|
165
|
+
# error_messages_for @user
|
166
|
+
#
|
167
|
+
# This will use the last part of the model name in the presentation. For instance, if
|
168
|
+
# this is a MyKlass::User object, this will use "user" as the name in the String. This
|
169
|
+
# is taken from MyKlass::User.model_name.human, which can be overridden.
|
170
|
+
#
|
157
171
|
# To specify more than one object, you simply list them; optionally, you can add an extra <tt>:object_name</tt> parameter, which
|
158
172
|
# will be the name used in the header message:
|
159
173
|
#
|
160
174
|
# error_messages_for 'user_common', 'user', :object_name => 'user'
|
161
175
|
#
|
176
|
+
# You can also use a number of objects, which will have the same naming semantics
|
177
|
+
# as a single object.
|
178
|
+
#
|
179
|
+
# error_messages_for @user, @post
|
180
|
+
#
|
162
181
|
# If the objects cannot be located as instance variables, you can add an extra <tt>:object</tt> parameter which gives the actual
|
163
182
|
# object (or array of objects to use):
|
164
183
|
#
|
@@ -170,13 +189,20 @@ module ActionView
|
|
170
189
|
def error_messages_for(*params)
|
171
190
|
options = params.extract_options!.symbolize_keys
|
172
191
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
192
|
+
objects = Array.wrap(options.delete(:object) || params).map do |object|
|
193
|
+
object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
|
194
|
+
object = convert_to_model(object)
|
195
|
+
|
196
|
+
if object.class.respond_to?(:model_name)
|
197
|
+
options[:object_name] ||= object.class.model_name.human.downcase
|
198
|
+
end
|
199
|
+
|
200
|
+
object
|
177
201
|
end
|
178
202
|
|
179
|
-
|
203
|
+
objects.compact!
|
204
|
+
count = objects.inject(0) {|sum, object| sum + object.errors.count }
|
205
|
+
|
180
206
|
unless count.zero?
|
181
207
|
html = {}
|
182
208
|
[:id, :class].each do |key|
|
@@ -189,23 +215,27 @@ module ActionView
|
|
189
215
|
end
|
190
216
|
options[:object_name] ||= params.first
|
191
217
|
|
192
|
-
I18n.with_options :locale => options[:locale], :scope => [:
|
218
|
+
I18n.with_options :locale => options[:locale], :scope => [:errors, :template] do |locale|
|
193
219
|
header_message = if options.include?(:header_message)
|
194
220
|
options[:header_message]
|
195
221
|
else
|
196
|
-
|
197
|
-
object_name = I18n.t(object_name, :default => object_name.gsub('_', ' '), :scope => [:activerecord, :models], :count => 1)
|
198
|
-
locale.t :header, :count => count, :model => object_name
|
222
|
+
locale.t :header, :count => count, :model => options[:object_name].to_s.gsub('_', ' ')
|
199
223
|
end
|
224
|
+
|
200
225
|
message = options.include?(:message) ? options[:message] : locale.t(:body)
|
201
|
-
|
226
|
+
|
227
|
+
error_messages = objects.sum do |object|
|
228
|
+
object.errors.full_messages.map do |msg|
|
229
|
+
content_tag(:li, ERB::Util.html_escape(msg))
|
230
|
+
end
|
231
|
+
end.join
|
202
232
|
|
203
233
|
contents = ''
|
204
234
|
contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
|
205
235
|
contents << content_tag(:p, message) unless message.blank?
|
206
236
|
contents << content_tag(:ul, error_messages)
|
207
237
|
|
208
|
-
content_tag(:div, contents
|
238
|
+
content_tag(:div, contents, html)
|
209
239
|
end
|
210
240
|
else
|
211
241
|
''
|
@@ -223,7 +253,14 @@ module ActionView
|
|
223
253
|
end
|
224
254
|
end
|
225
255
|
|
226
|
-
|
256
|
+
module ActiveRecordInstanceTag
|
257
|
+
def object
|
258
|
+
@active_model_object ||= begin
|
259
|
+
object = super
|
260
|
+
object.respond_to?(:to_model) ? object.to_model : object
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
227
264
|
def to_tag(options = {})
|
228
265
|
case column_type
|
229
266
|
when :string
|
@@ -244,62 +281,25 @@ module ActionView
|
|
244
281
|
end
|
245
282
|
end
|
246
283
|
|
247
|
-
|
248
|
-
|
249
|
-
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
|
250
|
-
error_wrapping(tag_without_error_wrapping(name, options), object.errors.on(@method_name))
|
251
|
-
else
|
252
|
-
tag_without_error_wrapping(name, options)
|
253
|
-
end
|
284
|
+
%w(tag content_tag to_date_select_tag to_datetime_select_tag to_time_select_tag).each do |meth|
|
285
|
+
module_eval "def #{meth}(*) error_wrapping(super) end"
|
254
286
|
end
|
255
287
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
error_wrapping(content_tag_without_error_wrapping(name, value, options), object.errors.on(@method_name))
|
288
|
+
def error_wrapping(html_tag)
|
289
|
+
if object.respond_to?(:errors) && object.errors.respond_to?(:full_messages) && object.errors[@method_name].any?
|
290
|
+
Base.field_error_proc.call(html_tag, self)
|
260
291
|
else
|
261
|
-
|
292
|
+
html_tag
|
262
293
|
end
|
263
294
|
end
|
264
295
|
|
265
|
-
alias_method :to_date_select_tag_without_error_wrapping, :to_date_select_tag
|
266
|
-
def to_date_select_tag(options = {}, html_options = {})
|
267
|
-
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
|
268
|
-
error_wrapping(to_date_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
|
269
|
-
else
|
270
|
-
to_date_select_tag_without_error_wrapping(options, html_options)
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
alias_method :to_datetime_select_tag_without_error_wrapping, :to_datetime_select_tag
|
275
|
-
def to_datetime_select_tag(options = {}, html_options = {})
|
276
|
-
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
|
277
|
-
error_wrapping(to_datetime_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
|
278
|
-
else
|
279
|
-
to_datetime_select_tag_without_error_wrapping(options, html_options)
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
alias_method :to_time_select_tag_without_error_wrapping, :to_time_select_tag
|
284
|
-
def to_time_select_tag(options = {}, html_options = {})
|
285
|
-
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
|
286
|
-
error_wrapping(to_time_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
|
287
|
-
else
|
288
|
-
to_time_select_tag_without_error_wrapping(options, html_options)
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
def error_wrapping(html_tag, has_error)
|
293
|
-
has_error ? Base.field_error_proc.call(html_tag, self) : html_tag
|
294
|
-
end
|
295
|
-
|
296
|
-
def error_message
|
297
|
-
object.errors.on(@method_name)
|
298
|
-
end
|
299
|
-
|
300
296
|
def column_type
|
301
297
|
object.send(:column_for_attribute, @method_name).type
|
302
298
|
end
|
303
299
|
end
|
300
|
+
|
301
|
+
class InstanceTag
|
302
|
+
include ActiveRecordInstanceTag
|
303
|
+
end
|
304
304
|
end
|
305
305
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
require 'thread'
|
1
2
|
require 'cgi'
|
2
3
|
require 'action_view/helpers/url_helper'
|
3
4
|
require 'action_view/helpers/tag_helper'
|
4
|
-
require '
|
5
|
+
require 'active_support/core_ext/file'
|
5
6
|
|
6
7
|
module ActionView
|
7
8
|
module Helpers #:nodoc:
|
@@ -132,10 +133,14 @@ module ActionView
|
|
132
133
|
# change. You can use something like Live HTTP Headers for Firefox to verify
|
133
134
|
# that the cache is indeed working.
|
134
135
|
module AssetTagHelper
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
assets_dir = defined?(Rails.public_path) ? Rails.public_path : "public"
|
137
|
+
ActionView::DEFAULT_CONFIG = {
|
138
|
+
:assets_dir => assets_dir,
|
139
|
+
:javascripts_dir => "#{assets_dir}/javascripts",
|
140
|
+
:stylesheets_dir => "#{assets_dir}/stylesheets",
|
141
|
+
}
|
142
|
+
|
143
|
+
JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls', 'rails'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES)
|
139
144
|
|
140
145
|
# Returns a link tag that browsers and news readers can use to auto-detect
|
141
146
|
# an RSS or ATOM feed. The +type+ can either be <tt>:rss</tt> (default) or
|
@@ -171,7 +176,7 @@ module ActionView
|
|
171
176
|
end
|
172
177
|
|
173
178
|
# Computes the path to a javascript asset in the public javascripts directory.
|
174
|
-
# If the +source+ filename has no extension, .js will be appended
|
179
|
+
# If the +source+ filename has no extension, .js will be appended (except for explicit URIs)
|
175
180
|
# Full paths from the document root will be passed through.
|
176
181
|
# Used internally by javascript_include_tag to build the script path.
|
177
182
|
#
|
@@ -179,7 +184,7 @@ module ActionView
|
|
179
184
|
# javascript_path "xmlhr" # => /javascripts/xmlhr.js
|
180
185
|
# javascript_path "dir/xmlhr.js" # => /javascripts/dir/xmlhr.js
|
181
186
|
# javascript_path "/dir/xmlhr" # => /dir/xmlhr.js
|
182
|
-
# javascript_path "http://www.railsapplication.com/js/xmlhr" # => http://www.railsapplication.com/js/xmlhr
|
187
|
+
# javascript_path "http://www.railsapplication.com/js/xmlhr" # => http://www.railsapplication.com/js/xmlhr
|
183
188
|
# javascript_path "http://www.railsapplication.com/js/xmlhr.js" # => http://www.railsapplication.com/js/xmlhr.js
|
184
189
|
def javascript_path(source)
|
185
190
|
compute_public_path(source, 'javascripts', 'js')
|
@@ -279,14 +284,16 @@ module ActionView
|
|
279
284
|
|
280
285
|
if concat || (ActionController::Base.perform_caching && cache)
|
281
286
|
joined_javascript_name = (cache == true ? "all" : cache) + ".js"
|
282
|
-
joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ?
|
287
|
+
joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? config.assets_dir : config.javascripts_dir, joined_javascript_name)
|
283
288
|
|
284
289
|
unless ActionController::Base.perform_caching && File.exists?(joined_javascript_path)
|
285
290
|
write_asset_file_contents(joined_javascript_path, compute_javascript_paths(sources, recursive))
|
286
291
|
end
|
287
292
|
javascript_src_tag(joined_javascript_name, options)
|
288
293
|
else
|
289
|
-
expand_javascript_sources(sources, recursive)
|
294
|
+
sources = expand_javascript_sources(sources, recursive)
|
295
|
+
ensure_javascript_sources!(sources) if cache
|
296
|
+
sources.collect { |source| javascript_src_tag(source, options) }.join("\n").html_safe
|
290
297
|
end
|
291
298
|
end
|
292
299
|
|
@@ -337,7 +344,7 @@ module ActionView
|
|
337
344
|
end
|
338
345
|
|
339
346
|
# Computes the path to a stylesheet asset in the public stylesheets directory.
|
340
|
-
# If the +source+ filename has no extension, <tt>.css</tt> will be appended.
|
347
|
+
# If the +source+ filename has no extension, <tt>.css</tt> will be appended (except for explicit URIs).
|
341
348
|
# Full paths from the document root will be passed through.
|
342
349
|
# Used internally by +stylesheet_link_tag+ to build the stylesheet path.
|
343
350
|
#
|
@@ -345,8 +352,8 @@ module ActionView
|
|
345
352
|
# stylesheet_path "style" # => /stylesheets/style.css
|
346
353
|
# stylesheet_path "dir/style.css" # => /stylesheets/dir/style.css
|
347
354
|
# stylesheet_path "/dir/style.css" # => /dir/style.css
|
348
|
-
# stylesheet_path "http://www.railsapplication.com/css/style" # => http://www.railsapplication.com/css/style
|
349
|
-
# stylesheet_path "http://www.railsapplication.com/css/style.
|
355
|
+
# stylesheet_path "http://www.railsapplication.com/css/style" # => http://www.railsapplication.com/css/style
|
356
|
+
# stylesheet_path "http://www.railsapplication.com/css/style.css" # => http://www.railsapplication.com/css/style.css
|
350
357
|
def stylesheet_path(source)
|
351
358
|
compute_public_path(source, 'stylesheets', 'css')
|
352
359
|
end
|
@@ -428,14 +435,16 @@ module ActionView
|
|
428
435
|
|
429
436
|
if concat || (ActionController::Base.perform_caching && cache)
|
430
437
|
joined_stylesheet_name = (cache == true ? "all" : cache) + ".css"
|
431
|
-
joined_stylesheet_path = File.join(joined_stylesheet_name[/^#{File::SEPARATOR}/] ?
|
438
|
+
joined_stylesheet_path = File.join(joined_stylesheet_name[/^#{File::SEPARATOR}/] ? config.assets_dir : config.stylesheets_dir, joined_stylesheet_name)
|
432
439
|
|
433
440
|
unless ActionController::Base.perform_caching && File.exists?(joined_stylesheet_path)
|
434
441
|
write_asset_file_contents(joined_stylesheet_path, compute_stylesheet_paths(sources, recursive))
|
435
442
|
end
|
436
443
|
stylesheet_tag(joined_stylesheet_name, options)
|
437
444
|
else
|
438
|
-
expand_stylesheet_sources(sources, recursive)
|
445
|
+
sources = expand_stylesheet_sources(sources, recursive)
|
446
|
+
ensure_stylesheet_sources!(sources) if cache
|
447
|
+
sources.collect { |source| stylesheet_tag(source, options) }.join("\n").html_safe
|
439
448
|
end
|
440
449
|
end
|
441
450
|
|
@@ -454,6 +463,36 @@ module ActionView
|
|
454
463
|
end
|
455
464
|
alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
|
456
465
|
|
466
|
+
# Computes the path to a video asset in the public videos directory.
|
467
|
+
# Full paths from the document root will be passed through.
|
468
|
+
# Used internally by +video_tag+ to build the video path.
|
469
|
+
#
|
470
|
+
# ==== Examples
|
471
|
+
# video_path("hd") # => /videos/hd
|
472
|
+
# video_path("hd.avi") # => /videos/hd.avi
|
473
|
+
# video_path("trailers/hd.avi") # => /videos/trailers/hd.avi
|
474
|
+
# video_path("/trailers/hd.avi") # => /trailers/hd.avi
|
475
|
+
# video_path("http://www.railsapplication.com/vid/hd.avi") # => http://www.railsapplication.com/vid/hd.avi
|
476
|
+
def video_path(source)
|
477
|
+
compute_public_path(source, 'videos')
|
478
|
+
end
|
479
|
+
alias_method :path_to_video, :video_path # aliased to avoid conflicts with a video_path named route
|
480
|
+
|
481
|
+
# Computes the path to an audio asset in the public audios directory.
|
482
|
+
# Full paths from the document root will be passed through.
|
483
|
+
# Used internally by +audio_tag+ to build the audio path.
|
484
|
+
#
|
485
|
+
# ==== Examples
|
486
|
+
# audio_path("horse") # => /audios/horse
|
487
|
+
# audio_path("horse.wav") # => /audios/horse.avi
|
488
|
+
# audio_path("sounds/horse.wav") # => /audios/sounds/horse.avi
|
489
|
+
# audio_path("/sounds/horse.wav") # => /sounds/horse.avi
|
490
|
+
# audio_path("http://www.railsapplication.com/sounds/horse.wav") # => http://www.railsapplication.com/sounds/horse.wav
|
491
|
+
def audio_path(source)
|
492
|
+
compute_public_path(source, 'audios')
|
493
|
+
end
|
494
|
+
alias_method :path_to_audio, :audio_path # aliased to avoid conflicts with an audio_path named route
|
495
|
+
|
457
496
|
# Returns an html image tag for the +source+. The +source+ can be a full
|
458
497
|
# path or a file that exists in your public images directory.
|
459
498
|
#
|
@@ -490,8 +529,8 @@ module ActionView
|
|
490
529
|
def image_tag(source, options = {})
|
491
530
|
options.symbolize_keys!
|
492
531
|
|
493
|
-
options[:src] = path_to_image(source)
|
494
|
-
options[:alt]
|
532
|
+
src = options[:src] = path_to_image(source)
|
533
|
+
options[:alt] ||= File.basename(src, '.*').split('.').first.to_s.capitalize
|
495
534
|
|
496
535
|
if size = options.delete(:size)
|
497
536
|
options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
|
@@ -499,12 +538,81 @@ module ActionView
|
|
499
538
|
|
500
539
|
if mouseover = options.delete(:mouseover)
|
501
540
|
options[:onmouseover] = "this.src='#{image_path(mouseover)}'"
|
502
|
-
options[:onmouseout] = "this.src='#{
|
541
|
+
options[:onmouseout] = "this.src='#{src}'"
|
503
542
|
end
|
504
543
|
|
505
544
|
tag("img", options)
|
506
545
|
end
|
507
546
|
|
547
|
+
# Returns an html video tag for the +sources+. If +sources+ is a string,
|
548
|
+
# a single video tag will be returned. If +sources+ is an array, a video
|
549
|
+
# tag with nested source tags for each source will be returned. The
|
550
|
+
# +sources+ can be full paths or files that exists in your public videos
|
551
|
+
# directory.
|
552
|
+
#
|
553
|
+
# ==== Options
|
554
|
+
# You can add HTML attributes using the +options+. The +options+ supports
|
555
|
+
# two additional keys for convenience and conformance:
|
556
|
+
#
|
557
|
+
# * <tt>:poster</tt> - Set an image (like a screenshot) to be shown
|
558
|
+
# before the video loads. The path is calculated like the +src+ of +image_tag+.
|
559
|
+
# * <tt>:size</tt> - Supplied as "{Width}x{Height}", so "30x45" becomes
|
560
|
+
# width="30" and height="45". <tt>:size</tt> will be ignored if the
|
561
|
+
# value is not in the correct format.
|
562
|
+
#
|
563
|
+
# ==== Examples
|
564
|
+
# video_tag("trailer") # =>
|
565
|
+
# <video src="/videos/trailer" />
|
566
|
+
# video_tag("trailer.ogg") # =>
|
567
|
+
# <video src="/videos/trailer.ogg" />
|
568
|
+
# video_tag("trailer.ogg", :controls => true, :autobuffer => true) # =>
|
569
|
+
# <video autobuffer="autobuffer" controls="controls" src="/videos/trailer.ogg" />
|
570
|
+
# video_tag("trailer.m4v", :size => "16x10", :poster => "screenshot.png") # =>
|
571
|
+
# <video src="/videos/trailer.m4v" width="16" height="10" poster="/images/screenshot.png" />
|
572
|
+
# video_tag("/trailers/hd.avi", :size => "16x16") # =>
|
573
|
+
# <video src="/trailers/hd.avi" width="16" height="16" />
|
574
|
+
# video_tag("/trailers/hd.avi", :height => '32', :width => '32') # =>
|
575
|
+
# <video height="32" src="/trailers/hd.avi" width="32" />
|
576
|
+
# video_tag(["trailer.ogg", "trailer.flv"]) # =>
|
577
|
+
# <video><source src="trailer.ogg" /><source src="trailer.ogg" /><source src="trailer.flv" /></video>
|
578
|
+
# video_tag(["trailer.ogg", "trailer.flv"] :size => "160x120") # =>
|
579
|
+
# <video height="120" width="160"><source src="trailer.ogg" /><source src="trailer.flv" /></video>
|
580
|
+
def video_tag(sources, options = {})
|
581
|
+
options.symbolize_keys!
|
582
|
+
|
583
|
+
options[:poster] = path_to_image(options[:poster]) if options[:poster]
|
584
|
+
|
585
|
+
if size = options.delete(:size)
|
586
|
+
options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
|
587
|
+
end
|
588
|
+
|
589
|
+
if sources.is_a?(Array)
|
590
|
+
content_tag("video", options) do
|
591
|
+
sources.map { |source| tag("source", :src => source) }.join.html_safe
|
592
|
+
end
|
593
|
+
else
|
594
|
+
options[:src] = path_to_video(sources)
|
595
|
+
tag("video", options)
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
599
|
+
# Returns an html audio tag for the +source+.
|
600
|
+
# The +source+ can be full path or file that exists in
|
601
|
+
# your public audios directory.
|
602
|
+
#
|
603
|
+
# ==== Examples
|
604
|
+
# audio_tag("sound") # =>
|
605
|
+
# <audio src="/audios/sound" />
|
606
|
+
# audio_tag("sound.wav") # =>
|
607
|
+
# <audio src="/audios/sound.wav" />
|
608
|
+
# audio_tag("sound.wav", :autoplay => true, :controls => true) # =>
|
609
|
+
# <audio autoplay="autoplay" controls="controls" src="/audios/sound.wav" />
|
610
|
+
def audio_tag(source, options = {})
|
611
|
+
options.symbolize_keys!
|
612
|
+
options[:src] = path_to_audio(source)
|
613
|
+
tag("audio", options)
|
614
|
+
end
|
615
|
+
|
508
616
|
def self.cache_asset_timestamps
|
509
617
|
@@cache_asset_timestamps
|
510
618
|
end
|
@@ -527,14 +635,14 @@ module ActionView
|
|
527
635
|
# roots. Rewrite the asset path for cache-busting asset ids. Include
|
528
636
|
# asset host, if configured, with the correct request protocol.
|
529
637
|
def compute_public_path(source, dir, ext = nil, include_host = true)
|
530
|
-
has_request =
|
638
|
+
has_request = controller.respond_to?(:request)
|
531
639
|
|
532
640
|
source_ext = File.extname(source)[1..-1]
|
533
|
-
if ext && (source_ext.blank? || (ext != source_ext && File.exist?(File.join(
|
641
|
+
if ext && !is_uri?(source) && (source_ext.blank? || (ext != source_ext && File.exist?(File.join(config.assets_dir, dir, "#{source}.#{ext}"))))
|
534
642
|
source += ".#{ext}"
|
535
643
|
end
|
536
644
|
|
537
|
-
unless source
|
645
|
+
unless is_uri?(source)
|
538
646
|
source = "/#{dir}/#{source}" unless source[0] == ?/
|
539
647
|
|
540
648
|
source = rewrite_asset_path(source)
|
@@ -546,11 +654,11 @@ module ActionView
|
|
546
654
|
end
|
547
655
|
end
|
548
656
|
|
549
|
-
if include_host && source
|
657
|
+
if include_host && !is_uri?(source)
|
550
658
|
host = compute_asset_host(source)
|
551
659
|
|
552
|
-
if has_request && !host.blank? && host
|
553
|
-
host = "#{
|
660
|
+
if has_request && !host.blank? && !is_uri?(host)
|
661
|
+
host = "#{controller.request.protocol}#{host}"
|
554
662
|
end
|
555
663
|
|
556
664
|
"#{host}#{source}"
|
@@ -559,6 +667,10 @@ module ActionView
|
|
559
667
|
end
|
560
668
|
end
|
561
669
|
|
670
|
+
def is_uri?(path)
|
671
|
+
path =~ %r{^[-a-z]+://}
|
672
|
+
end
|
673
|
+
|
562
674
|
# Pick an asset host for this source. Returns +nil+ if no host is set,
|
563
675
|
# the host if no wildcard is set, the host interpolated with the
|
564
676
|
# numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
|
@@ -569,7 +681,7 @@ module ActionView
|
|
569
681
|
if host.is_a?(Proc) || host.respond_to?(:call)
|
570
682
|
case host.is_a?(Proc) ? host.arity : host.method(:call).arity
|
571
683
|
when 2
|
572
|
-
request =
|
684
|
+
request = controller.respond_to?(:request) && controller.request
|
573
685
|
host.call(source, request)
|
574
686
|
else
|
575
687
|
host.call(source)
|
@@ -592,7 +704,7 @@ module ActionView
|
|
592
704
|
if @@cache_asset_timestamps && (asset_id = @@asset_timestamps_cache[source])
|
593
705
|
asset_id
|
594
706
|
else
|
595
|
-
path = File.join(
|
707
|
+
path = File.join(config.assets_dir, source)
|
596
708
|
asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : ''
|
597
709
|
|
598
710
|
if @@cache_asset_timestamps
|
@@ -635,20 +747,20 @@ module ActionView
|
|
635
747
|
|
636
748
|
def expand_javascript_sources(sources, recursive = false)
|
637
749
|
if sources.include?(:all)
|
638
|
-
all_javascript_files = collect_asset_files(
|
750
|
+
all_javascript_files = collect_asset_files(config.javascripts_dir, ('**' if recursive), '*.js')
|
639
751
|
((determine_source(:defaults, @@javascript_expansions).dup & all_javascript_files) + all_javascript_files).uniq
|
640
752
|
else
|
641
753
|
expanded_sources = sources.collect do |source|
|
642
754
|
determine_source(source, @@javascript_expansions)
|
643
755
|
end.flatten
|
644
|
-
expanded_sources << "application" if sources.include?(:defaults) && File.exist?(File.join(
|
756
|
+
expanded_sources << "application" if sources.include?(:defaults) && File.exist?(File.join(config.javascripts_dir, "application.js"))
|
645
757
|
expanded_sources
|
646
758
|
end
|
647
759
|
end
|
648
760
|
|
649
761
|
def expand_stylesheet_sources(sources, recursive)
|
650
762
|
if sources.first == :all
|
651
|
-
collect_asset_files(
|
763
|
+
collect_asset_files(config.stylesheets_dir, ('**' if recursive), '*.css')
|
652
764
|
else
|
653
765
|
sources.collect do |source|
|
654
766
|
determine_source(source, @@stylesheet_expansions)
|
@@ -665,13 +777,28 @@ module ActionView
|
|
665
777
|
end
|
666
778
|
end
|
667
779
|
|
780
|
+
def ensure_stylesheet_sources!(sources)
|
781
|
+
sources.each do |source|
|
782
|
+
asset_file_path!(path_to_stylesheet(source))
|
783
|
+
end
|
784
|
+
return sources
|
785
|
+
end
|
786
|
+
|
787
|
+
def ensure_javascript_sources!(sources)
|
788
|
+
sources.each do |source|
|
789
|
+
asset_file_path!(path_to_javascript(source))
|
790
|
+
end
|
791
|
+
return sources
|
792
|
+
end
|
793
|
+
|
668
794
|
def join_asset_file_contents(paths)
|
669
|
-
paths.collect { |path| File.read(asset_file_path(path)) }.join("\n\n")
|
795
|
+
paths.collect { |path| File.read(asset_file_path!(path)) }.join("\n\n")
|
670
796
|
end
|
671
797
|
|
672
798
|
def write_asset_file_contents(joined_asset_path, asset_paths)
|
799
|
+
|
673
800
|
FileUtils.mkdir_p(File.dirname(joined_asset_path))
|
674
|
-
File.
|
801
|
+
File.atomic_write(joined_asset_path) { |cache| cache.write(join_asset_file_contents(asset_paths)) }
|
675
802
|
|
676
803
|
# Set mtime to the latest of the combined files to allow for
|
677
804
|
# consistent ETag without a shared filesystem.
|
@@ -680,7 +807,15 @@ module ActionView
|
|
680
807
|
end
|
681
808
|
|
682
809
|
def asset_file_path(path)
|
683
|
-
File.join(
|
810
|
+
File.join(config.assets_dir, path.split('?').first)
|
811
|
+
end
|
812
|
+
|
813
|
+
def asset_file_path!(path)
|
814
|
+
unless is_uri?(path)
|
815
|
+
absolute_path = asset_file_path(path)
|
816
|
+
raise(Errno::ENOENT, "Asset file not found at '#{absolute_path}'" ) unless File.exist?(absolute_path)
|
817
|
+
return absolute_path
|
818
|
+
end
|
684
819
|
end
|
685
820
|
|
686
821
|
def collect_asset_files(*path)
|