actionpack_csi 2.3.5.p6
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 +5184 -0
- data/MIT-LICENSE +21 -0
- data/README +409 -0
- data/RUNNING_UNIT_TESTS +24 -0
- data/Rakefile +160 -0
- data/install.rb +30 -0
- data/lib/action_controller/assertions/dom_assertions.rb +55 -0
- data/lib/action_controller/assertions/model_assertions.rb +21 -0
- data/lib/action_controller/assertions/response_assertions.rb +160 -0
- data/lib/action_controller/assertions/routing_assertions.rb +146 -0
- data/lib/action_controller/assertions/selector_assertions.rb +638 -0
- data/lib/action_controller/assertions/tag_assertions.rb +127 -0
- data/lib/action_controller/base.rb +1423 -0
- data/lib/action_controller/benchmarking.rb +107 -0
- data/lib/action_controller/caching/actions.rb +177 -0
- data/lib/action_controller/caching/fragments.rb +120 -0
- data/lib/action_controller/caching/pages.rb +152 -0
- data/lib/action_controller/caching/sweeper.rb +45 -0
- data/lib/action_controller/caching/sweeping.rb +55 -0
- data/lib/action_controller/caching.rb +71 -0
- data/lib/action_controller/cgi_ext/cookie.rb +112 -0
- data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
- data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
- data/lib/action_controller/cgi_ext.rb +15 -0
- data/lib/action_controller/cgi_process.rb +77 -0
- data/lib/action_controller/cookies.rb +95 -0
- data/lib/action_controller/dispatcher.rb +133 -0
- data/lib/action_controller/failsafe.rb +86 -0
- data/lib/action_controller/filters.rb +680 -0
- data/lib/action_controller/flash.rb +171 -0
- data/lib/action_controller/headers.rb +33 -0
- data/lib/action_controller/helpers.rb +225 -0
- data/lib/action_controller/http_authentication.rb +309 -0
- data/lib/action_controller/integration.rb +692 -0
- data/lib/action_controller/layout.rb +286 -0
- data/lib/action_controller/middleware_stack.rb +119 -0
- data/lib/action_controller/middlewares.rb +14 -0
- data/lib/action_controller/mime_responds.rb +193 -0
- data/lib/action_controller/mime_type.rb +212 -0
- data/lib/action_controller/mime_types.rb +21 -0
- data/lib/action_controller/params_parser.rb +77 -0
- data/lib/action_controller/performance_test.rb +15 -0
- data/lib/action_controller/polymorphic_routes.rb +189 -0
- data/lib/action_controller/rack_lint_patch.rb +36 -0
- data/lib/action_controller/record_identifier.rb +104 -0
- data/lib/action_controller/reloader.rb +54 -0
- data/lib/action_controller/request.rb +493 -0
- data/lib/action_controller/request_forgery_protection.rb +113 -0
- data/lib/action_controller/rescue.rb +183 -0
- data/lib/action_controller/resources.rb +682 -0
- data/lib/action_controller/response.rb +239 -0
- data/lib/action_controller/routing/builder.rb +197 -0
- data/lib/action_controller/routing/optimisations.rb +130 -0
- data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
- data/lib/action_controller/routing/route.rb +265 -0
- data/lib/action_controller/routing/route_set.rb +502 -0
- data/lib/action_controller/routing/routing_ext.rb +49 -0
- data/lib/action_controller/routing/segments.rb +343 -0
- data/lib/action_controller/routing.rb +388 -0
- data/lib/action_controller/session/abstract_store.rb +181 -0
- data/lib/action_controller/session/cookie_store.rb +221 -0
- data/lib/action_controller/session/mem_cache_store.rb +51 -0
- data/lib/action_controller/session_management.rb +54 -0
- data/lib/action_controller/status_codes.rb +88 -0
- data/lib/action_controller/streaming.rb +181 -0
- data/lib/action_controller/string_coercion.rb +29 -0
- data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
- data/lib/action_controller/templates/rescues/_trace.erb +26 -0
- data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
- data/lib/action_controller/templates/rescues/layout.erb +29 -0
- data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
- data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
- data/lib/action_controller/templates/rescues/template_error.erb +21 -0
- data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
- data/lib/action_controller/test_case.rb +209 -0
- data/lib/action_controller/test_process.rb +580 -0
- data/lib/action_controller/translation.rb +13 -0
- data/lib/action_controller/uploaded_file.rb +44 -0
- data/lib/action_controller/url_rewriter.rb +216 -0
- data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
- data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
- data/lib/action_controller/vendor/html-scanner.rb +16 -0
- data/lib/action_controller/verification.rb +130 -0
- data/lib/action_controller.rb +113 -0
- data/lib/action_pack/version.rb +9 -0
- data/lib/action_pack.rb +24 -0
- data/lib/action_view/base.rb +362 -0
- data/lib/action_view/erb/util.rb +44 -0
- data/lib/action_view/helpers/active_record_helper.rb +305 -0
- data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
- data/lib/action_view/helpers/benchmark_helper.rb +54 -0
- data/lib/action_view/helpers/cache_helper.rb +39 -0
- data/lib/action_view/helpers/capture_helper.rb +136 -0
- data/lib/action_view/helpers/date_helper.rb +988 -0
- data/lib/action_view/helpers/debug_helper.rb +38 -0
- data/lib/action_view/helpers/form_helper.rb +1074 -0
- data/lib/action_view/helpers/form_options_helper.rb +600 -0
- data/lib/action_view/helpers/form_tag_helper.rb +487 -0
- data/lib/action_view/helpers/javascript_helper.rb +208 -0
- data/lib/action_view/helpers/number_helper.rb +308 -0
- data/lib/action_view/helpers/prototype_helper.rb +1305 -0
- data/lib/action_view/helpers/raw_output_helper.rb +9 -0
- data/lib/action_view/helpers/record_identification_helper.rb +20 -0
- data/lib/action_view/helpers/record_tag_helper.rb +58 -0
- data/lib/action_view/helpers/sanitize_helper.rb +259 -0
- data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
- data/lib/action_view/helpers/tag_helper.rb +150 -0
- data/lib/action_view/helpers/text_helper.rb +587 -0
- data/lib/action_view/helpers/translation_helper.rb +39 -0
- data/lib/action_view/helpers/url_helper.rb +639 -0
- data/lib/action_view/helpers.rb +59 -0
- data/lib/action_view/inline_template.rb +19 -0
- data/lib/action_view/locale/en.yml +117 -0
- data/lib/action_view/partials.rb +240 -0
- data/lib/action_view/paths.rb +69 -0
- data/lib/action_view/reloadable_template.rb +117 -0
- data/lib/action_view/renderable.rb +95 -0
- data/lib/action_view/renderable_partial.rb +47 -0
- data/lib/action_view/safe_buffer.rb +28 -0
- data/lib/action_view/template.rb +252 -0
- data/lib/action_view/template_error.rb +99 -0
- data/lib/action_view/template_handler.rb +34 -0
- data/lib/action_view/template_handlers/builder.rb +17 -0
- data/lib/action_view/template_handlers/erb.rb +22 -0
- data/lib/action_view/template_handlers/rjs.rb +13 -0
- data/lib/action_view/template_handlers.rb +48 -0
- data/lib/action_view/test_case.rb +162 -0
- data/lib/action_view.rb +58 -0
- data/lib/actionpack.rb +2 -0
- data/test/abstract_unit.rb +61 -0
- data/test/active_record_unit.rb +104 -0
- data/test/activerecord/active_record_store_test.rb +174 -0
- data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
- data/test/adv_attr_test.rb +20 -0
- data/test/controller/action_pack_assertions_test.rb +543 -0
- data/test/controller/addresses_render_test.rb +37 -0
- data/test/controller/assert_select_test.rb +734 -0
- data/test/controller/base_test.rb +217 -0
- data/test/controller/benchmark_test.rb +32 -0
- data/test/controller/caching_test.rb +729 -0
- data/test/controller/capture_test.rb +66 -0
- data/test/controller/content_type_test.rb +168 -0
- 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 +134 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
- data/test/controller/dispatcher_test.rb +144 -0
- data/test/controller/dom_assertions_test.rb +53 -0
- data/test/controller/failsafe_test.rb +60 -0
- data/test/controller/fake_controllers.rb +33 -0
- data/test/controller/fake_models.rb +19 -0
- data/test/controller/filter_params_test.rb +52 -0
- data/test/controller/filters_test.rb +885 -0
- data/test/controller/flash_test.rb +147 -0
- data/test/controller/header_test.rb +14 -0
- data/test/controller/helper_test.rb +224 -0
- data/test/controller/html-scanner/cdata_node_test.rb +15 -0
- data/test/controller/html-scanner/document_test.rb +148 -0
- data/test/controller/html-scanner/node_test.rb +89 -0
- data/test/controller/html-scanner/sanitizer_test.rb +274 -0
- data/test/controller/html-scanner/tag_node_test.rb +238 -0
- data/test/controller/html-scanner/text_node_test.rb +50 -0
- data/test/controller/html-scanner/tokenizer_test.rb +131 -0
- data/test/controller/http_basic_authentication_test.rb +113 -0
- data/test/controller/http_digest_authentication_test.rb +254 -0
- data/test/controller/integration_test.rb +483 -0
- data/test/controller/layout_test.rb +215 -0
- data/test/controller/logging_test.rb +46 -0
- data/test/controller/middleware_stack_test.rb +90 -0
- data/test/controller/mime_responds_test.rb +536 -0
- data/test/controller/mime_type_test.rb +93 -0
- data/test/controller/polymorphic_routes_test.rb +297 -0
- data/test/controller/rack_test.rb +311 -0
- data/test/controller/record_identifier_test.rb +139 -0
- data/test/controller/redirect_test.rb +285 -0
- data/test/controller/reloader_test.rb +124 -0
- data/test/controller/render_test.rb +1762 -0
- data/test/controller/request/json_params_parsing_test.rb +65 -0
- data/test/controller/request/multipart_params_parsing_test.rb +162 -0
- data/test/controller/request/query_string_parsing_test.rb +120 -0
- data/test/controller/request/test_request_test.rb +35 -0
- data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
- data/test/controller/request/xml_params_parsing_test.rb +103 -0
- data/test/controller/request_forgery_protection_test.rb +265 -0
- data/test/controller/request_test.rb +395 -0
- data/test/controller/rescue_test.rb +536 -0
- data/test/controller/resources_test.rb +1393 -0
- data/test/controller/routing_test.rb +2591 -0
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +171 -0
- data/test/controller/session/cookie_store_test.rb +216 -0
- data/test/controller/session/mem_cache_store_test.rb +127 -0
- data/test/controller/session/test_session_test.rb +58 -0
- data/test/controller/test_test.rb +700 -0
- data/test/controller/translation_test.rb +26 -0
- data/test/controller/url_rewriter_test.rb +385 -0
- data/test/controller/verification_test.rb +270 -0
- data/test/controller/view_paths_test.rb +141 -0
- data/test/controller/webservice_test.rb +273 -0
- data/test/fixtures/_top_level_partial.html.erb +1 -0
- data/test/fixtures/_top_level_partial_only.erb +1 -0
- data/test/fixtures/addresses/list.erb +1 -0
- data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
- data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
- data/test/fixtures/companies.yml +24 -0
- data/test/fixtures/company.rb +10 -0
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
- data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
- data/test/fixtures/customers/_customer.html.erb +1 -0
- data/test/fixtures/db_definitions/sqlite.sql +49 -0
- data/test/fixtures/developer.rb +9 -0
- data/test/fixtures/developers/_developer.erb +1 -0
- data/test/fixtures/developers.yml +21 -0
- data/test/fixtures/developers_projects.yml +13 -0
- data/test/fixtures/failsafe/500.html +1 -0
- data/test/fixtures/fun/games/_game.erb +1 -0
- data/test/fixtures/fun/games/hello_world.erb +1 -0
- data/test/fixtures/fun/serious/games/_game.erb +1 -0
- data/test/fixtures/functional_caching/_partial.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
- data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
- data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
- data/test/fixtures/helpers/abc_helper.rb +5 -0
- data/test/fixtures/helpers/fun/games_helper.rb +3 -0
- data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
- data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
- data/test/fixtures/layouts/_column.html.erb +2 -0
- data/test/fixtures/layouts/block_with_layout.erb +3 -0
- data/test/fixtures/layouts/builder.builder +3 -0
- data/test/fixtures/layouts/default_html.html.erb +1 -0
- data/test/fixtures/layouts/partial_with_layout.erb +3 -0
- data/test/fixtures/layouts/standard.erb +1 -0
- data/test/fixtures/layouts/talk_from_action.erb +2 -0
- data/test/fixtures/layouts/xhr.html.erb +2 -0
- data/test/fixtures/layouts/yield.erb +2 -0
- data/test/fixtures/mascot.rb +3 -0
- data/test/fixtures/mascots/_mascot.html.erb +1 -0
- data/test/fixtures/mascots.yml +4 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +10 -0
- data/test/fixtures/multipart/bracketed_param +5 -0
- data/test/fixtures/multipart/empty +10 -0
- data/test/fixtures/multipart/hello.txt +1 -0
- data/test/fixtures/multipart/large_text_file +10 -0
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +9 -0
- data/test/fixtures/multipart/single_parameter +5 -0
- data/test/fixtures/multipart/text_file +10 -0
- data/test/fixtures/override/test/hello_world.erb +1 -0
- data/test/fixtures/override2/layouts/test/sub.erb +1 -0
- data/test/fixtures/post_test/layouts/post.html.erb +1 -0
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
- data/test/fixtures/post_test/post/index.html.erb +1 -0
- data/test/fixtures/post_test/post/index.iphone.erb +1 -0
- data/test/fixtures/post_test/super_post/index.html.erb +1 -0
- data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
- data/test/fixtures/project.rb +3 -0
- data/test/fixtures/projects/_project.erb +1 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/public/404.html +1 -0
- data/test/fixtures/public/500.da.html +1 -0
- data/test/fixtures/public/500.html +1 -0
- data/test/fixtures/public/absolute/test.css +23 -0
- data/test/fixtures/public/absolute/test.js +63 -0
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +1 -0
- data/test/fixtures/public/javascripts/bank.js +1 -0
- data/test/fixtures/public/javascripts/controls.js +1 -0
- data/test/fixtures/public/javascripts/dragdrop.js +1 -0
- data/test/fixtures/public/javascripts/effects.js +1 -0
- data/test/fixtures/public/javascripts/prototype.js +1 -0
- data/test/fixtures/public/javascripts/robber.js +1 -0
- data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
- data/test/fixtures/public/javascripts/version.1.0.js +1 -0
- data/test/fixtures/public/stylesheets/bank.css +1 -0
- data/test/fixtures/public/stylesheets/robber.css +1 -0
- data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
- data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
- data/test/fixtures/quiz/questions/_question.html.erb +1 -0
- data/test/fixtures/replies/_reply.erb +1 -0
- data/test/fixtures/replies.yml +15 -0
- data/test/fixtures/reply.rb +7 -0
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
- data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
- data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
- data/test/fixtures/scope/test/modgreet.erb +1 -0
- data/test/fixtures/shared.html.erb +1 -0
- data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
- data/test/fixtures/test/_counter.html.erb +1 -0
- data/test/fixtures/test/_customer.erb +1 -0
- data/test/fixtures/test/_customer_counter.erb +1 -0
- data/test/fixtures/test/_customer_greeting.erb +1 -0
- data/test/fixtures/test/_customer_with_var.erb +1 -0
- data/test/fixtures/test/_form.erb +1 -0
- data/test/fixtures/test/_from_helper.erb +1 -0
- data/test/fixtures/test/_hash_greeting.erb +1 -0
- data/test/fixtures/test/_hash_object.erb +2 -0
- data/test/fixtures/test/_hello.builder +1 -0
- data/test/fixtures/test/_labelling_form.erb +1 -0
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
- data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
- data/test/fixtures/test/_local_inspector.html.erb +1 -0
- data/test/fixtures/test/_one.html.erb +1 -0
- data/test/fixtures/test/_partial.erb +1 -0
- data/test/fixtures/test/_partial.html.erb +1 -0
- data/test/fixtures/test/_partial.js.erb +1 -0
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
- data/test/fixtures/test/_partial_only.erb +1 -0
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
- data/test/fixtures/test/_person.erb +2 -0
- data/test/fixtures/test/_raise.html.erb +1 -0
- data/test/fixtures/test/_two.html.erb +1 -0
- data/test/fixtures/test/action_talk_to_layout.erb +2 -0
- data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
- data/test/fixtures/test/capturing.erb +4 -0
- data/test/fixtures/test/content_for.erb +2 -0
- data/test/fixtures/test/content_for_concatenated.erb +3 -0
- data/test/fixtures/test/content_for_with_parameter.erb +2 -0
- data/test/fixtures/test/delete_with_js.rjs +2 -0
- data/test/fixtures/test/dont_pick_me +1 -0
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/enum_rjs_test.rjs +6 -0
- data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.builder +1 -0
- data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
- data/test/fixtures/test/greeting.erb +1 -0
- data/test/fixtures/test/greeting.js.rjs +1 -0
- data/test/fixtures/test/hello.builder +4 -0
- data/test/fixtures/test/hello_world.da.html.erb +1 -0
- data/test/fixtures/test/hello_world.erb +1 -0
- data/test/fixtures/test/hello_world.erb~ +1 -0
- data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
- data/test/fixtures/test/hello_world_container.builder +3 -0
- data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
- data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
- data/test/fixtures/test/hello_xml_world.builder +11 -0
- data/test/fixtures/test/hyphen-ated.erb +1 -0
- data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
- data/test/fixtures/test/list.erb +1 -0
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
- data/test/fixtures/test/nested_layout.erb +3 -0
- data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
- data/test/fixtures/test/potential_conflicts.erb +4 -0
- data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
- data/test/fixtures/test/render_file_from_template.html.erb +1 -0
- data/test/fixtures/test/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/render_file_with_locals.erb +1 -0
- data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
- data/test/fixtures/test/render_to_string_test.erb +1 -0
- data/test/fixtures/test/sub_template_raise.html.erb +1 -0
- data/test/fixtures/test/template.erb +1 -0
- data/test/fixtures/test/update_element_with_capture.erb +9 -0
- data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
- data/test/fixtures/test/utf8.html.erb +2 -0
- data/test/fixtures/topic.rb +3 -0
- data/test/fixtures/topics/_topic.html.erb +1 -0
- data/test/fixtures/topics.yml +22 -0
- data/test/template/active_record_helper_i18n_test.rb +44 -0
- data/test/template/active_record_helper_test.rb +302 -0
- data/test/template/asset_tag_helper_test.rb +771 -0
- data/test/template/atom_feed_helper_test.rb +315 -0
- data/test/template/benchmark_helper_test.rb +86 -0
- data/test/template/compiled_templates_test.rb +204 -0
- data/test/template/date_helper_i18n_test.rb +121 -0
- data/test/template/date_helper_test.rb +2485 -0
- data/test/template/erb_util_test.rb +24 -0
- data/test/template/form_helper_test.rb +1393 -0
- data/test/template/form_options_helper_i18n_test.rb +27 -0
- data/test/template/form_options_helper_test.rb +807 -0
- data/test/template/form_tag_helper_test.rb +344 -0
- data/test/template/javascript_helper_test.rb +106 -0
- data/test/template/number_helper_i18n_test.rb +69 -0
- data/test/template/number_helper_test.rb +132 -0
- data/test/template/prototype_helper_test.rb +639 -0
- data/test/template/raw_output_helper_test.rb +21 -0
- data/test/template/record_tag_helper_test.rb +58 -0
- data/test/template/render_test.rb +290 -0
- data/test/template/sanitize_helper_test.rb +57 -0
- data/test/template/scriptaculous_helper_test.rb +90 -0
- data/test/template/tag_helper_test.rb +98 -0
- data/test/template/template_test.rb +32 -0
- data/test/template/test_test.rb +54 -0
- data/test/template/text_helper_test.rb +543 -0
- data/test/template/translation_helper_test.rb +32 -0
- data/test/template/url_helper_test.rb +622 -0
- data/test/testing_sandbox.rb +15 -0
- data/test/view/safe_buffer_test.rb +36 -0
- data/test/view/test_case_test.rb +176 -0
- metadata +531 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
# Adds easy defaults to writing Atom feeds with the Builder template engine (this does not work on ERb or any other
|
|
4
|
+
# template languages).
|
|
5
|
+
module ActionView
|
|
6
|
+
module Helpers #:nodoc:
|
|
7
|
+
module AtomFeedHelper
|
|
8
|
+
# Full usage example:
|
|
9
|
+
#
|
|
10
|
+
# config/routes.rb:
|
|
11
|
+
# ActionController::Routing::Routes.draw do |map|
|
|
12
|
+
# map.resources :posts
|
|
13
|
+
# map.root :controller => "posts"
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# app/controllers/posts_controller.rb:
|
|
17
|
+
# class PostsController < ApplicationController::Base
|
|
18
|
+
# # GET /posts.html
|
|
19
|
+
# # GET /posts.atom
|
|
20
|
+
# def index
|
|
21
|
+
# @posts = Post.find(:all)
|
|
22
|
+
#
|
|
23
|
+
# respond_to do |format|
|
|
24
|
+
# format.html
|
|
25
|
+
# format.atom
|
|
26
|
+
# end
|
|
27
|
+
# end
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
# app/views/posts/index.atom.builder:
|
|
31
|
+
# atom_feed do |feed|
|
|
32
|
+
# feed.title("My great blog!")
|
|
33
|
+
# feed.updated(@posts.first.created_at)
|
|
34
|
+
#
|
|
35
|
+
# for post in @posts
|
|
36
|
+
# feed.entry(post) do |entry|
|
|
37
|
+
# entry.title(post.title)
|
|
38
|
+
# entry.content(post.body, :type => 'html')
|
|
39
|
+
#
|
|
40
|
+
# entry.author do |author|
|
|
41
|
+
# author.name("DHH")
|
|
42
|
+
# end
|
|
43
|
+
# end
|
|
44
|
+
# end
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
# The options for atom_feed are:
|
|
48
|
+
#
|
|
49
|
+
# * <tt>:language</tt>: Defaults to "en-US".
|
|
50
|
+
# * <tt>:root_url</tt>: The HTML alternative that this feed is doubling for. Defaults to / on the current host.
|
|
51
|
+
# * <tt>:url</tt>: The URL for this feed. Defaults to the current URL.
|
|
52
|
+
# * <tt>:id</tt>: The id for this feed. Defaults to "tag:#{request.host},#{options[:schema_date]}:#{request.request_uri.split(".")[0]}"
|
|
53
|
+
# * <tt>:schema_date</tt>: The date at which the tag scheme for the feed was first used. A good default is the year you
|
|
54
|
+
# created the feed. See http://feedvalidator.org/docs/error/InvalidTAG.html for more information. If not specified,
|
|
55
|
+
# 2005 is used (as an "I don't care" value).
|
|
56
|
+
# * <tt>:instruct</tt>: Hash of XML processing instructions in the form {target => {attribute => value, }} or {target => [{attribute => value, }, ]}
|
|
57
|
+
#
|
|
58
|
+
# Other namespaces can be added to the root element:
|
|
59
|
+
#
|
|
60
|
+
# app/views/posts/index.atom.builder:
|
|
61
|
+
# atom_feed({'xmlns:app' => 'http://www.w3.org/2007/app',
|
|
62
|
+
# 'xmlns:openSearch' => 'http://a9.com/-/spec/opensearch/1.1/'}) do |feed|
|
|
63
|
+
# feed.title("My great blog!")
|
|
64
|
+
# feed.updated((@posts.first.created_at))
|
|
65
|
+
# feed.tag!(openSearch:totalResults, 10)
|
|
66
|
+
#
|
|
67
|
+
# for post in @posts
|
|
68
|
+
# feed.entry(post) do |entry|
|
|
69
|
+
# entry.title(post.title)
|
|
70
|
+
# entry.content(post.body, :type => 'html')
|
|
71
|
+
# entry.tag!('app:edited', Time.now)
|
|
72
|
+
#
|
|
73
|
+
# entry.author do |author|
|
|
74
|
+
# author.name("DHH")
|
|
75
|
+
# end
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# The Atom spec defines five elements (content rights title subtitle
|
|
81
|
+
# summary) which may directly contain xhtml content if :type => 'xhtml'
|
|
82
|
+
# is specified as an attribute. If so, this helper will take care of
|
|
83
|
+
# the enclosing div and xhtml namespace declaration. Example usage:
|
|
84
|
+
#
|
|
85
|
+
# entry.summary :type => 'xhtml' do |xhtml|
|
|
86
|
+
# xhtml.p pluralize(order.line_items.count, "line item")
|
|
87
|
+
# xhtml.p "Shipped to #{order.address}"
|
|
88
|
+
# xhtml.p "Paid by #{order.pay_type}"
|
|
89
|
+
# end
|
|
90
|
+
#
|
|
91
|
+
#
|
|
92
|
+
# atom_feed yields an AtomFeedBuilder instance. Nested elements yield
|
|
93
|
+
# an AtomBuilder instance.
|
|
94
|
+
def atom_feed(options = {}, &block)
|
|
95
|
+
if options[:schema_date]
|
|
96
|
+
options[:schema_date] = options[:schema_date].strftime("%Y-%m-%d") if options[:schema_date].respond_to?(:strftime)
|
|
97
|
+
else
|
|
98
|
+
options[:schema_date] = "2005" # The Atom spec copyright date
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
xml = options.delete(:xml) || eval("xml", block.binding)
|
|
102
|
+
xml.instruct!
|
|
103
|
+
if options[:instruct]
|
|
104
|
+
options[:instruct].each do |target,attrs|
|
|
105
|
+
if attrs.respond_to?(:keys)
|
|
106
|
+
xml.instruct!(target, attrs)
|
|
107
|
+
elsif attrs.respond_to?(:each)
|
|
108
|
+
attrs.each { |attr_group| xml.instruct!(target, attr_group) }
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
feed_opts = {"xml:lang" => options[:language] || "en-US", "xmlns" => 'http://www.w3.org/2005/Atom'}
|
|
114
|
+
feed_opts.merge!(options).reject!{|k,v| !k.to_s.match(/^xml/)}
|
|
115
|
+
|
|
116
|
+
xml.feed(feed_opts) do
|
|
117
|
+
xml.id(options[:id] || "tag:#{request.host},#{options[:schema_date]}:#{request.request_uri.split(".")[0]}")
|
|
118
|
+
xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:root_url] || (request.protocol + request.host_with_port))
|
|
119
|
+
xml.link(:rel => 'self', :type => 'application/atom+xml', :href => options[:url] || request.url)
|
|
120
|
+
|
|
121
|
+
yield AtomFeedBuilder.new(xml, self, options)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class AtomBuilder
|
|
126
|
+
XHTML_TAG_NAMES = %w(content rights title subtitle summary).to_set
|
|
127
|
+
|
|
128
|
+
def initialize(xml)
|
|
129
|
+
@xml = xml
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
private
|
|
133
|
+
# Delegate to xml builder, first wrapping the element in a xhtml
|
|
134
|
+
# namespaced div element if the method and arguments indicate
|
|
135
|
+
# that an xhtml_block? is desired.
|
|
136
|
+
def method_missing(method, *arguments, &block)
|
|
137
|
+
if xhtml_block?(method, arguments)
|
|
138
|
+
@xml.__send__(method, *arguments) do
|
|
139
|
+
@xml.div(:xmlns => 'http://www.w3.org/1999/xhtml') do |xhtml|
|
|
140
|
+
block.call(xhtml)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
else
|
|
144
|
+
@xml.__send__(method, *arguments, &block)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# True if the method name matches one of the five elements defined
|
|
149
|
+
# in the Atom spec as potentially containing XHTML content and
|
|
150
|
+
# if :type => 'xhtml' is, in fact, specified.
|
|
151
|
+
def xhtml_block?(method, arguments)
|
|
152
|
+
if XHTML_TAG_NAMES.include?(method.to_s)
|
|
153
|
+
last = arguments.last
|
|
154
|
+
last.is_a?(Hash) && last[:type].to_s == 'xhtml'
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
class AtomFeedBuilder < AtomBuilder
|
|
160
|
+
def initialize(xml, view, feed_options = {})
|
|
161
|
+
@xml, @view, @feed_options = xml, view, feed_options
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Accepts a Date or Time object and inserts it in the proper format. If nil is passed, current time in UTC is used.
|
|
165
|
+
def updated(date_or_time = nil)
|
|
166
|
+
@xml.updated((date_or_time || Time.now.utc).xmlschema)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Creates an entry tag for a specific record and prefills the id using class and id.
|
|
170
|
+
#
|
|
171
|
+
# Options:
|
|
172
|
+
#
|
|
173
|
+
# * <tt>:published</tt>: Time first published. Defaults to the created_at attribute on the record if one such exists.
|
|
174
|
+
# * <tt>:updated</tt>: Time of update. Defaults to the updated_at attribute on the record if one such exists.
|
|
175
|
+
# * <tt>:url</tt>: The URL for this entry. Defaults to the polymorphic_url for the record.
|
|
176
|
+
# * <tt>:id</tt>: The ID for this entry. Defaults to "tag:#{@view.request.host},#{@feed_options[:schema_date]}:#{record.class}/#{record.id}"
|
|
177
|
+
def entry(record, options = {})
|
|
178
|
+
@xml.entry do
|
|
179
|
+
@xml.id(options[:id] || "tag:#{@view.request.host},#{@feed_options[:schema_date]}:#{record.class}/#{record.id}")
|
|
180
|
+
|
|
181
|
+
if options[:published] || (record.respond_to?(:created_at) && record.created_at)
|
|
182
|
+
@xml.published((options[:published] || record.created_at).xmlschema)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if options[:updated] || (record.respond_to?(:updated_at) && record.updated_at)
|
|
186
|
+
@xml.updated((options[:updated] || record.updated_at).xmlschema)
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
@xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:url] || @view.polymorphic_url(record))
|
|
190
|
+
|
|
191
|
+
yield AtomBuilder.new(@xml)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'benchmark'
|
|
2
|
+
|
|
3
|
+
module ActionView
|
|
4
|
+
module Helpers
|
|
5
|
+
# This helper offers a method to measure the execution time of a block
|
|
6
|
+
# in a template.
|
|
7
|
+
module BenchmarkHelper
|
|
8
|
+
# Allows you to measure the execution time of a block
|
|
9
|
+
# in a template and records the result to the log. Wrap this block around
|
|
10
|
+
# expensive operations or possible bottlenecks to get a time reading
|
|
11
|
+
# for the operation. For example, let's say you thought your file
|
|
12
|
+
# processing method was taking too long; you could wrap it in a benchmark block.
|
|
13
|
+
#
|
|
14
|
+
# <% benchmark "Process data files" do %>
|
|
15
|
+
# <%= expensive_files_operation %>
|
|
16
|
+
# <% end %>
|
|
17
|
+
#
|
|
18
|
+
# That would add something like "Process data files (345.2ms)" to the log,
|
|
19
|
+
# which you can then use to compare timings when optimizing your code.
|
|
20
|
+
#
|
|
21
|
+
# You may give an optional logger level as the :level option.
|
|
22
|
+
# (:debug, :info, :warn, :error); the default value is :info.
|
|
23
|
+
#
|
|
24
|
+
# <% benchmark "Low-level files", :level => :debug do %>
|
|
25
|
+
# <%= lowlevel_files_operation %>
|
|
26
|
+
# <% end %>
|
|
27
|
+
#
|
|
28
|
+
# Finally, you can pass true as the third argument to silence all log activity
|
|
29
|
+
# inside the block. This is great for boiling down a noisy block to just a single statement:
|
|
30
|
+
#
|
|
31
|
+
# <% benchmark "Process data files", :level => :info, :silence => true do %>
|
|
32
|
+
# <%= expensive_and_chatty_files_operation %>
|
|
33
|
+
# <% end %>
|
|
34
|
+
def benchmark(message = "Benchmarking", options = {})
|
|
35
|
+
if controller.logger
|
|
36
|
+
if options.is_a?(Symbol)
|
|
37
|
+
ActiveSupport::Deprecation.warn("use benchmark('#{message}', :level => :#{options}) instead", caller)
|
|
38
|
+
options = { :level => options, :silence => false }
|
|
39
|
+
else
|
|
40
|
+
options.assert_valid_keys(:level, :silence)
|
|
41
|
+
options[:level] ||= :info
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
result = nil
|
|
45
|
+
ms = Benchmark.ms { result = options[:silence] ? controller.logger.silence { yield } : yield }
|
|
46
|
+
controller.logger.send(options[:level], '%s (%.1fms)' % [ message, ms ])
|
|
47
|
+
result
|
|
48
|
+
else
|
|
49
|
+
yield
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
module Helpers
|
|
3
|
+
# This helper to exposes a method for caching of view fragments.
|
|
4
|
+
# See ActionController::Caching::Fragments for usage instructions.
|
|
5
|
+
module CacheHelper
|
|
6
|
+
# A method for caching fragments of a view rather than an entire
|
|
7
|
+
# action or page. This technique is useful caching pieces like
|
|
8
|
+
# menus, lists of news topics, static HTML fragments, and so on.
|
|
9
|
+
# This method takes a block that contains the content you wish
|
|
10
|
+
# to cache. See ActionController::Caching::Fragments for more
|
|
11
|
+
# information.
|
|
12
|
+
#
|
|
13
|
+
# ==== Examples
|
|
14
|
+
# If you wanted to cache a navigation menu, you could do the
|
|
15
|
+
# following.
|
|
16
|
+
#
|
|
17
|
+
# <% cache do %>
|
|
18
|
+
# <%= render :partial => "menu" %>
|
|
19
|
+
# <% end %>
|
|
20
|
+
#
|
|
21
|
+
# You can also cache static content...
|
|
22
|
+
#
|
|
23
|
+
# <% cache do %>
|
|
24
|
+
# <p>Hello users! Welcome to our website!</p>
|
|
25
|
+
# <% end %>
|
|
26
|
+
#
|
|
27
|
+
# ...and static content mixed with RHTML content.
|
|
28
|
+
#
|
|
29
|
+
# <% cache do %>
|
|
30
|
+
# Topics:
|
|
31
|
+
# <%= render :partial => "topics", :collection => @topic_list %>
|
|
32
|
+
# <i>Topics listed alphabetically</i>
|
|
33
|
+
# <% end %>
|
|
34
|
+
def cache(name = {}, options = nil, &block)
|
|
35
|
+
@controller.fragment_for(output_buffer, name, options, &block)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
module Helpers
|
|
3
|
+
# CaptureHelper exposes methods to let you extract generated markup which
|
|
4
|
+
# can be used in other parts of a template or layout file.
|
|
5
|
+
# It provides a method to capture blocks into variables through capture and
|
|
6
|
+
# a way to capture a block of markup for use in a layout through content_for.
|
|
7
|
+
module CaptureHelper
|
|
8
|
+
# The capture method allows you to extract part of a template into a
|
|
9
|
+
# variable. You can then use this variable anywhere in your templates or layout.
|
|
10
|
+
#
|
|
11
|
+
# ==== Examples
|
|
12
|
+
# The capture method can be used in ERb templates...
|
|
13
|
+
#
|
|
14
|
+
# <% @greeting = capture do %>
|
|
15
|
+
# Welcome to my shiny new web page! The date and time is
|
|
16
|
+
# <%= Time.now %>
|
|
17
|
+
# <% end %>
|
|
18
|
+
#
|
|
19
|
+
# ...and Builder (RXML) templates.
|
|
20
|
+
#
|
|
21
|
+
# @timestamp = capture do
|
|
22
|
+
# "The current timestamp is #{Time.now}."
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# You can then use that variable anywhere else. For example:
|
|
26
|
+
#
|
|
27
|
+
# <html>
|
|
28
|
+
# <head><title><%= @greeting %></title></head>
|
|
29
|
+
# <body>
|
|
30
|
+
# <b><%= @greeting %></b>
|
|
31
|
+
# </body></html>
|
|
32
|
+
#
|
|
33
|
+
def capture(*args, &block)
|
|
34
|
+
# Return captured buffer in erb.
|
|
35
|
+
if block_called_from_erb?(block)
|
|
36
|
+
with_output_buffer { block.call(*args) }
|
|
37
|
+
else
|
|
38
|
+
# Return block result otherwise, but protect buffer also.
|
|
39
|
+
with_output_buffer { return block.call(*args) }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Calling content_for stores a block of markup in an identifier for later use.
|
|
44
|
+
# You can make subsequent calls to the stored content in other templates or the layout
|
|
45
|
+
# by passing the identifier as an argument to <tt>yield</tt>.
|
|
46
|
+
#
|
|
47
|
+
# ==== Examples
|
|
48
|
+
#
|
|
49
|
+
# <% content_for :not_authorized do %>
|
|
50
|
+
# alert('You are not authorized to do that!')
|
|
51
|
+
# <% end %>
|
|
52
|
+
#
|
|
53
|
+
# You can then use <tt>yield :not_authorized</tt> anywhere in your templates.
|
|
54
|
+
#
|
|
55
|
+
# <%= yield :not_authorized if current_user.nil? %>
|
|
56
|
+
#
|
|
57
|
+
# You can also use this syntax alongside an existing call to <tt>yield</tt> in a layout. For example:
|
|
58
|
+
#
|
|
59
|
+
# <%# This is the layout %>
|
|
60
|
+
# <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
61
|
+
# <head>
|
|
62
|
+
# <title>My Website</title>
|
|
63
|
+
# <%= yield :script %>
|
|
64
|
+
# </head>
|
|
65
|
+
# <body>
|
|
66
|
+
# <%= yield %>
|
|
67
|
+
# </body>
|
|
68
|
+
# </html>
|
|
69
|
+
#
|
|
70
|
+
# And now, we'll create a view that has a content_for call that
|
|
71
|
+
# creates the <tt>script</tt> identifier.
|
|
72
|
+
#
|
|
73
|
+
# <%# This is our view %>
|
|
74
|
+
# Please login!
|
|
75
|
+
#
|
|
76
|
+
# <% content_for :script do %>
|
|
77
|
+
# <script type="text/javascript">alert('You are not authorized to view this page!')</script>
|
|
78
|
+
# <% end %>
|
|
79
|
+
#
|
|
80
|
+
# Then, in another view, you could to do something like this:
|
|
81
|
+
#
|
|
82
|
+
# <%= link_to_remote 'Logout', :action => 'logout' %>
|
|
83
|
+
#
|
|
84
|
+
# <% content_for :script do %>
|
|
85
|
+
# <%= javascript_include_tag :defaults %>
|
|
86
|
+
# <% end %>
|
|
87
|
+
#
|
|
88
|
+
# That will place <script> tags for Prototype, Scriptaculous, and application.js (if it exists)
|
|
89
|
+
# on the page; this technique is useful if you'll only be using these scripts in a few views.
|
|
90
|
+
#
|
|
91
|
+
# Note that content_for concatenates the blocks it is given for a particular
|
|
92
|
+
# identifier in order. For example:
|
|
93
|
+
#
|
|
94
|
+
# <% content_for :navigation do %>
|
|
95
|
+
# <li><%= link_to 'Home', :action => 'index' %></li>
|
|
96
|
+
# <% end %>
|
|
97
|
+
#
|
|
98
|
+
# <%# Add some other content, or use a different template: %>
|
|
99
|
+
#
|
|
100
|
+
# <% content_for :navigation do %>
|
|
101
|
+
# <li><%= link_to 'Login', :action => 'login' %></li>
|
|
102
|
+
# <% end %>
|
|
103
|
+
#
|
|
104
|
+
# Then, in another template or layout, this code would render both links in order:
|
|
105
|
+
#
|
|
106
|
+
# <ul><%= yield :navigation %></ul>
|
|
107
|
+
#
|
|
108
|
+
# Lastly, simple content can be passed as a parameter:
|
|
109
|
+
#
|
|
110
|
+
# <% content_for :script, javascript_include_tag(:defaults) %>
|
|
111
|
+
#
|
|
112
|
+
# WARNING: content_for is ignored in caches. So you shouldn't use it
|
|
113
|
+
# for elements that will be fragment cached.
|
|
114
|
+
#
|
|
115
|
+
# The deprecated way of accessing a content_for block is to use an instance variable
|
|
116
|
+
# named <tt>@content_for_#{name_of_the_content_block}</tt>. The preferred usage is now
|
|
117
|
+
# <tt><%= yield :footer %></tt>.
|
|
118
|
+
def content_for(name, content = nil, &block)
|
|
119
|
+
ivar = "@content_for_#{name}"
|
|
120
|
+
content = capture(&block) if block_given?
|
|
121
|
+
instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe!)
|
|
122
|
+
nil
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Use an alternate output buffer for the duration of the block.
|
|
126
|
+
# Defaults to a new empty string.
|
|
127
|
+
def with_output_buffer(buf = "") #:nodoc:
|
|
128
|
+
self.output_buffer, old_buffer = buf, output_buffer
|
|
129
|
+
yield
|
|
130
|
+
output_buffer
|
|
131
|
+
ensure
|
|
132
|
+
self.output_buffer = old_buffer
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|