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
@@ -32,7 +32,7 @@ module ActionView
|
|
32
32
|
# <i>Topics listed alphabetically</i>
|
33
33
|
# <% end %>
|
34
34
|
def cache(name = {}, options = nil, &block)
|
35
|
-
|
35
|
+
controller.fragment_for(output_buffer, name, options, &block)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -111,26 +111,58 @@ module ActionView
|
|
111
111
|
#
|
112
112
|
# WARNING: content_for is ignored in caches. So you shouldn't use it
|
113
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
114
|
def content_for(name, content = nil, &block)
|
119
|
-
ivar = "@content_for_#{name}"
|
120
115
|
content = capture(&block) if block_given?
|
121
|
-
|
122
|
-
|
116
|
+
return @_content_for[name] << content if content
|
117
|
+
@_content_for[name]
|
118
|
+
end
|
119
|
+
|
120
|
+
# content_for? simply checks whether any content has been captured yet using content_for
|
121
|
+
# Useful to render parts of your layout differently based on what is in your views.
|
122
|
+
#
|
123
|
+
# ==== Examples
|
124
|
+
#
|
125
|
+
# Perhaps you will use different css in you layout if no content_for :right_column
|
126
|
+
#
|
127
|
+
# <%# This is the layout %>
|
128
|
+
# <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
129
|
+
# <head>
|
130
|
+
# <title>My Website</title>
|
131
|
+
# <%= yield :script %>
|
132
|
+
# </head>
|
133
|
+
# <body class="<%= content_for?(:right_col) ? 'one-column' : 'two-column' %>">
|
134
|
+
# <%= yield %>
|
135
|
+
# <%= yield :right_col %>
|
136
|
+
# </body>
|
137
|
+
# </html>
|
138
|
+
def content_for?(name)
|
139
|
+
@_content_for[name].present?
|
123
140
|
end
|
124
141
|
|
125
142
|
# Use an alternate output buffer for the duration of the block.
|
126
143
|
# Defaults to a new empty string.
|
127
|
-
def with_output_buffer(buf =
|
144
|
+
def with_output_buffer(buf = nil) #:nodoc:
|
145
|
+
unless buf
|
146
|
+
buf = ActiveSupport::SafeBuffer.new
|
147
|
+
buf.force_encoding(output_buffer.encoding) if buf.respond_to?(:force_encoding)
|
148
|
+
end
|
128
149
|
self.output_buffer, old_buffer = buf, output_buffer
|
129
150
|
yield
|
130
151
|
output_buffer
|
131
152
|
ensure
|
132
153
|
self.output_buffer = old_buffer
|
133
154
|
end
|
155
|
+
|
156
|
+
# Add the output buffer to the response body and start a new one.
|
157
|
+
def flush_output_buffer #:nodoc:
|
158
|
+
if output_buffer && !output_buffer.empty?
|
159
|
+
response.body_parts << output_buffer
|
160
|
+
new = ''
|
161
|
+
new.force_encoding(output_buffer.encoding) if new.respond_to?(:force_encoding)
|
162
|
+
self.output_buffer = new
|
163
|
+
nil
|
164
|
+
end
|
165
|
+
end
|
134
166
|
end
|
135
167
|
end
|
136
168
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
module ActionView
|
2
|
-
# = Action View CSRF Helper
|
3
2
|
module Helpers
|
4
3
|
module CsrfHelper
|
5
|
-
# Returns a meta tag with the
|
6
|
-
# for forms to use. Place this in your head.
|
4
|
+
# Returns a meta tag with the request forgery protection token for forms to use. Put this in your head.
|
7
5
|
def csrf_meta_tag
|
8
6
|
if protect_against_forgery?
|
9
|
-
%(<meta name="csrf-param" content="#{
|
7
|
+
%(<meta name="csrf-param" content="#{Rack::Utils.escape_html(request_forgery_protection_token)}"/>\n<meta name="csrf-token" content="#{Rack::Utils.escape_html(form_authenticity_token)}"/>).html_safe
|
10
8
|
end
|
11
9
|
end
|
12
10
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require "date"
|
2
2
|
require 'action_view/helpers/tag_helper'
|
3
|
-
require 'active_support/core_ext/hash/slice'
|
4
3
|
|
5
4
|
module ActionView
|
6
5
|
module Helpers
|
@@ -119,18 +118,18 @@ module ActionView
|
|
119
118
|
alias_method :distance_of_time_in_words_to_now, :time_ago_in_words
|
120
119
|
|
121
120
|
# Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based
|
122
|
-
# attribute (identified by +method+) on an object assigned to the template (identified by +object+).
|
123
|
-
#
|
121
|
+
# attribute (identified by +method+) on an object assigned to the template (identified by +object+).
|
122
|
+
#
|
124
123
|
#
|
125
124
|
# ==== Options
|
126
125
|
# * <tt>:use_month_numbers</tt> - Set to true if you want to use month numbers rather than month names (e.g.
|
127
126
|
# "2" instead of "February").
|
128
|
-
# * <tt>:use_short_month</tt> - Set to true if you want to use
|
129
|
-
#
|
130
|
-
# * <tt>:
|
127
|
+
# * <tt>:use_short_month</tt> - Set to true if you want to use abbreviated month names instead of full
|
128
|
+
# month names (e.g. "Feb" instead of "February").
|
129
|
+
# * <tt>:add_month_numbers</tt> - Set to true if you want to use both month numbers and month names (e.g.
|
131
130
|
# "2 - February" instead of "February").
|
132
131
|
# * <tt>:use_month_names</tt> - Set to an array with 12 month names if you want to customize month names.
|
133
|
-
# Note: You can also use Rails'
|
132
|
+
# Note: You can also use Rails' i18n functionality for this.
|
134
133
|
# * <tt>:date_separator</tt> - Specifies a string to separate the date fields. Default is "" (i.e. nothing).
|
135
134
|
# * <tt>:start_year</tt> - Set the start year for the year select. Default is <tt>Time.now.year - 5</tt>.
|
136
135
|
# * <tt>:end_year</tt> - Set the end year for the year select. Default is <tt>Time.now.year + 5</tt>.
|
@@ -141,7 +140,7 @@ module ActionView
|
|
141
140
|
# as a hidden field instead of showing a select field. Also note that this implicitly sets :discard_day to true.
|
142
141
|
# * <tt>:discard_year</tt> - Set to true if you don't want to show a year select. This includes the year
|
143
142
|
# as a hidden field instead of showing a select field.
|
144
|
-
# * <tt>:order</tt> - Set to an array containing <tt>:day</tt>, <tt>:month</tt> and <tt>:year</tt>
|
143
|
+
# * <tt>:order</tt> - Set to an array containing <tt>:day</tt>, <tt>:month</tt> and <tt>:year</tt> to
|
145
144
|
# customize the order in which the select fields are shown. If you leave out any of the symbols, the respective
|
146
145
|
# select will not be shown (like when you set <tt>:discard_xxx => true</tt>. Defaults to the order defined in
|
147
146
|
# the respective locale (e.g. [:year, :month, :day] in the en locale that ships with Rails).
|
@@ -245,7 +244,7 @@ module ActionView
|
|
245
244
|
|
246
245
|
# Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a
|
247
246
|
# specified datetime-based attribute (identified by +method+) on an object assigned to the template (identified
|
248
|
-
# by +object+).
|
247
|
+
# by +object+).
|
249
248
|
#
|
250
249
|
# If anything is passed in the html_options hash it will be applied to every select tag in the set.
|
251
250
|
#
|
@@ -816,7 +815,7 @@ module ActionView
|
|
816
815
|
tag_options[:selected] = "selected" if selected == i
|
817
816
|
select_options << content_tag(:option, value, tag_options)
|
818
817
|
end
|
819
|
-
|
818
|
+
select_options.join("\n") + "\n"
|
820
819
|
end
|
821
820
|
|
822
821
|
# Builds select tag from date type and html select options
|
@@ -834,9 +833,9 @@ module ActionView
|
|
834
833
|
select_html = "\n"
|
835
834
|
select_html << content_tag(:option, '', :value => '') + "\n" if @options[:include_blank]
|
836
835
|
select_html << prompt_option_tag(type, @options[:prompt]) + "\n" if @options[:prompt]
|
837
|
-
select_html << select_options_as_html
|
836
|
+
select_html << select_options_as_html.to_s
|
838
837
|
|
839
|
-
(content_tag(:select, select_html
|
838
|
+
(content_tag(:select, select_html, select_options) + "\n").html_safe
|
840
839
|
end
|
841
840
|
|
842
841
|
# Builds a prompt option tag with supplied options or from default options
|
@@ -866,7 +865,7 @@ module ActionView
|
|
866
865
|
:id => input_id_from_type(type),
|
867
866
|
:name => input_name_from_type(type),
|
868
867
|
:value => value
|
869
|
-
}
|
868
|
+
}) + "\n").html_safe
|
870
869
|
end
|
871
870
|
|
872
871
|
# Returns the name attribute for the input tag
|
@@ -908,7 +907,7 @@ module ActionView
|
|
908
907
|
when :hour
|
909
908
|
(@options[:discard_year] && @options[:discard_day]) ? "" : @options[:datetime_separator]
|
910
909
|
when :minute
|
911
|
-
@options[:
|
910
|
+
@options[:time_separator]
|
912
911
|
when :second
|
913
912
|
@options[:include_seconds] ? @options[:time_separator] : ""
|
914
913
|
end
|
@@ -936,7 +935,7 @@ module ActionView
|
|
936
935
|
options[:field_name] = @method_name
|
937
936
|
options[:include_position] = true
|
938
937
|
options[:prefix] ||= @object_name
|
939
|
-
options[:index] = @auto_index if
|
938
|
+
options[:index] = @auto_index if @auto_index && !options.has_key?(:index)
|
940
939
|
options[:datetime_separator] ||= ' — '
|
941
940
|
options[:time_separator] ||= ' : '
|
942
941
|
|
@@ -2,6 +2,8 @@ require 'cgi'
|
|
2
2
|
require 'action_view/helpers/date_helper'
|
3
3
|
require 'action_view/helpers/tag_helper'
|
4
4
|
require 'action_view/helpers/form_tag_helper'
|
5
|
+
require 'active_support/core_ext/class/inheritable_attributes'
|
6
|
+
require 'active_support/core_ext/hash/slice'
|
5
7
|
|
6
8
|
module ActionView
|
7
9
|
module Helpers
|
@@ -223,6 +225,33 @@ module ActionView
|
|
223
225
|
# ...
|
224
226
|
# <% end %>
|
225
227
|
#
|
228
|
+
# === Unobtrusive JavaScript
|
229
|
+
#
|
230
|
+
# Specifying:
|
231
|
+
#
|
232
|
+
# :remote => true
|
233
|
+
#
|
234
|
+
# in the options hash creates a form that will allow the unobtrusive JavaScript drivers to modify its
|
235
|
+
# behaviour. The expected default behaviour is an XMLHttpRequest in the background instead of the regular
|
236
|
+
# POST arrangement, but ultimately the behaviour is the choice of the JavaScript driver implementor.
|
237
|
+
# Even though it's using JavaScript to serialize the form elements, the form submission will work just like
|
238
|
+
# a regular submission as viewed by the receiving side (all elements available in <tt>params</tt>).
|
239
|
+
#
|
240
|
+
# Example:
|
241
|
+
#
|
242
|
+
# <% form_for(:post, @post, :remote => true, :html => { :id => 'create-post', :method => :put }) do |f| %>
|
243
|
+
# ...
|
244
|
+
# <% end %>
|
245
|
+
#
|
246
|
+
# The HTML generated for this would be:
|
247
|
+
#
|
248
|
+
# <form action='http://www.example.com' id='create-post' method='post' data-remote='true'>
|
249
|
+
# <div style='margin:0;padding:0;display:inline'>
|
250
|
+
# <input name='_method' type='hidden' value='put' />
|
251
|
+
# </div>
|
252
|
+
# ...
|
253
|
+
# </form>
|
254
|
+
#
|
226
255
|
# === Customized form builders
|
227
256
|
#
|
228
257
|
# You can also build forms using a customized FormBuilder class. Subclass
|
@@ -278,14 +307,18 @@ module ActionView
|
|
278
307
|
args.unshift object
|
279
308
|
end
|
280
309
|
|
310
|
+
options[:html][:remote] = true if options.delete(:remote)
|
311
|
+
|
281
312
|
concat(form_tag(options.delete(:url) || {}, options.delete(:html) || {}))
|
282
313
|
fields_for(object_name, *(args << options), &proc)
|
283
|
-
|
314
|
+
safe_concat('</form>')
|
284
315
|
end
|
285
316
|
|
286
317
|
def apply_form_for_options!(object_or_array, options) #:nodoc:
|
287
318
|
object = object_or_array.is_a?(Array) ? object_or_array.last : object_or_array
|
288
319
|
|
320
|
+
object = convert_to_model(object)
|
321
|
+
|
289
322
|
html_options =
|
290
323
|
if object.respond_to?(:new_record?) && object.new_record?
|
291
324
|
{ :class => dom_class(object, :new), :id => dom_id(object), :method => :post }
|
@@ -391,7 +424,7 @@ module ActionView
|
|
391
424
|
# accepts_nested_attributes_for :address, :allow_destroy => true
|
392
425
|
# end
|
393
426
|
#
|
394
|
-
# Now, when you use a form element with the <tt>
|
427
|
+
# Now, when you use a form element with the <tt>_delete</tt> parameter,
|
395
428
|
# with a value that evaluates to +true+, you will destroy the associated
|
396
429
|
# model (eg. 1, '1', true, or 'true'):
|
397
430
|
#
|
@@ -399,7 +432,7 @@ module ActionView
|
|
399
432
|
# ...
|
400
433
|
# <% person_form.fields_for :address do |address_fields| %>
|
401
434
|
# ...
|
402
|
-
# Delete: <%= address_fields.check_box :
|
435
|
+
# Delete: <%= address_fields.check_box :_delete %>
|
403
436
|
# <% end %>
|
404
437
|
# <% end %>
|
405
438
|
#
|
@@ -472,14 +505,14 @@ module ActionView
|
|
472
505
|
# end
|
473
506
|
#
|
474
507
|
# This will allow you to specify which models to destroy in the
|
475
|
-
# attributes hash by adding a form element for the <tt>
|
508
|
+
# attributes hash by adding a form element for the <tt>_delete</tt>
|
476
509
|
# parameter with a value that evaluates to +true+
|
477
510
|
# (eg. 1, '1', true, or 'true'):
|
478
511
|
#
|
479
512
|
# <% form_for @person, :url => { :action => "update" } do |person_form| %>
|
480
513
|
# ...
|
481
514
|
# <% person_form.fields_for :projects do |project_fields| %>
|
482
|
-
# Delete: <%= project_fields.check_box :
|
515
|
+
# Delete: <%= project_fields.check_box :_delete %>
|
483
516
|
# <% end %>
|
484
517
|
# <% end %>
|
485
518
|
def fields_for(record_or_name_or_array, *args, &block)
|
@@ -501,7 +534,7 @@ module ActionView
|
|
501
534
|
|
502
535
|
# Returns a label tag tailored for labelling an input field for a specified attribute (identified by +method+) on an object
|
503
536
|
# assigned to the template (identified by +object+). The text of label will default to the attribute name unless a translation
|
504
|
-
# is found in the current I18n locale (through
|
537
|
+
# is found in the current I18n locale (through helpers.label.<modelname>.<attribute>) or you specify it explicitly.
|
505
538
|
# Additional options on the label tag can be passed as a hash with +options+. These options will be tagged
|
506
539
|
# onto the HTML as an HTML element attribute as in the example shown, except for the <tt>:value</tt> option, which is designed to
|
507
540
|
# target labels for radio_button tags (where the value is used in the ID of the input tag).
|
@@ -513,8 +546,8 @@ module ActionView
|
|
513
546
|
# You can localize your labels based on model and attribute names.
|
514
547
|
# For example you can define the following in your locale (e.g. en.yml)
|
515
548
|
#
|
516
|
-
#
|
517
|
-
#
|
549
|
+
# helpers:
|
550
|
+
# label:
|
518
551
|
# post:
|
519
552
|
# body: "Write your entire text here"
|
520
553
|
#
|
@@ -525,7 +558,7 @@ module ActionView
|
|
525
558
|
#
|
526
559
|
# Localization can also be based purely on the translation of the attribute-name like this:
|
527
560
|
#
|
528
|
-
#
|
561
|
+
# activemodel:
|
529
562
|
# attribute:
|
530
563
|
# post:
|
531
564
|
# cost: "Total cost"
|
@@ -657,8 +690,8 @@ module ActionView
|
|
657
690
|
|
658
691
|
# Returns a checkbox tag tailored for accessing a specified attribute (identified by +method+) on an object
|
659
692
|
# assigned to the template (identified by +object+). This object must be an instance object (@object) and not a local object.
|
660
|
-
# It's intended that +method+ returns an integer and if that integer is above zero, then the checkbox is checked.
|
661
|
-
# Additional options on the input tag can be passed as a hash with +options+. The +checked_value+ defaults to 1
|
693
|
+
# It's intended that +method+ returns an integer and if that integer is above zero, then the checkbox is checked.
|
694
|
+
# Additional options on the input tag can be passed as a hash with +options+. The +checked_value+ defaults to 1
|
662
695
|
# while the default +unchecked_value+ is set to 0 which is convenient for boolean values.
|
663
696
|
#
|
664
697
|
# ==== Gotcha
|
@@ -740,7 +773,8 @@ module ActionView
|
|
740
773
|
end
|
741
774
|
end
|
742
775
|
|
743
|
-
|
776
|
+
module InstanceTagMethods #:nodoc:
|
777
|
+
extend ActiveSupport::Concern
|
744
778
|
include Helpers::TagHelper, Helpers::FormTagHelper
|
745
779
|
|
746
780
|
attr_reader :method_name, :object_name
|
@@ -772,8 +806,7 @@ module ActionView
|
|
772
806
|
options["for"] ||= name_and_id["id"]
|
773
807
|
|
774
808
|
content = if text.blank?
|
775
|
-
|
776
|
-
i18n_label if i18n_label.present?
|
809
|
+
I18n.t("helpers.label.#{object_name}.#{method_name}", :default => "").presence
|
777
810
|
else
|
778
811
|
text.to_s
|
779
812
|
end
|
@@ -794,7 +827,7 @@ module ActionView
|
|
794
827
|
if field_type == "hidden"
|
795
828
|
options.delete("size")
|
796
829
|
end
|
797
|
-
options["type"]
|
830
|
+
options["type"] ||= field_type
|
798
831
|
options["value"] ||= value_before_type_cast(object) unless field_type == "file"
|
799
832
|
options["value"] &&= html_escape(options["value"])
|
800
833
|
add_default_name_and_id(options)
|
@@ -838,7 +871,12 @@ module ActionView
|
|
838
871
|
checked = self.class.check_box_checked?(value(object), checked_value)
|
839
872
|
end
|
840
873
|
options["checked"] = "checked" if checked
|
841
|
-
|
874
|
+
if options["multiple"]
|
875
|
+
add_default_name_and_id_for_value(checked_value, options)
|
876
|
+
options.delete("multiple")
|
877
|
+
else
|
878
|
+
add_default_name_and_id(options)
|
879
|
+
end
|
842
880
|
hidden = tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value)
|
843
881
|
checkbox = tag("input", options)
|
844
882
|
(hidden + checkbox).html_safe
|
@@ -877,7 +915,7 @@ module ActionView
|
|
877
915
|
self.class.value_before_type_cast(object, @method_name)
|
878
916
|
end
|
879
917
|
|
880
|
-
|
918
|
+
module ClassMethods
|
881
919
|
def value(object, method_name)
|
882
920
|
object.send method_name unless object.nil?
|
883
921
|
end
|
@@ -963,6 +1001,10 @@ module ActionView
|
|
963
1001
|
end
|
964
1002
|
end
|
965
1003
|
|
1004
|
+
class InstanceTag
|
1005
|
+
include InstanceTagMethods
|
1006
|
+
end
|
1007
|
+
|
966
1008
|
class FormBuilder #:nodoc:
|
967
1009
|
# The methods which wrap a form helper call.
|
968
1010
|
class_inheritable_accessor :field_helpers
|
@@ -970,6 +1012,14 @@ module ActionView
|
|
970
1012
|
|
971
1013
|
attr_accessor :object_name, :object, :options
|
972
1014
|
|
1015
|
+
def self.model_name
|
1016
|
+
@model_name ||= Struct.new(:partial_path).new(name.demodulize.underscore.sub!(/_builder$/, ''))
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
def to_model
|
1020
|
+
self
|
1021
|
+
end
|
1022
|
+
|
973
1023
|
def initialize(object_name, object, template, options, proc)
|
974
1024
|
@nested_child_index = {}
|
975
1025
|
@object_name, @object, @template, @options, @proc = object_name, object, template, options, proc
|
@@ -984,7 +1034,7 @@ module ActionView
|
|
984
1034
|
end
|
985
1035
|
|
986
1036
|
(field_helpers - %w(label check_box radio_button fields_for hidden_field)).each do |selector|
|
987
|
-
src
|
1037
|
+
src = <<-end_src
|
988
1038
|
def #{selector}(method, options = {}) # def text_field(method, options = {})
|
989
1039
|
@template.send( # @template.send(
|
990
1040
|
#{selector.inspect}, # "text_field",
|
@@ -993,7 +1043,7 @@ module ActionView
|
|
993
1043
|
objectify_options(options)) # objectify_options(options))
|
994
1044
|
end # end
|
995
1045
|
end_src
|
996
|
-
class_eval src, __FILE__,
|
1046
|
+
class_eval src, __FILE__, __LINE__
|
997
1047
|
end
|
998
1048
|
|
999
1049
|
def fields_for(record_or_name_or_array, *args, &block)
|
@@ -1042,21 +1092,50 @@ module ActionView
|
|
1042
1092
|
def radio_button(method, tag_value, options = {})
|
1043
1093
|
@template.radio_button(@object_name, method, tag_value, objectify_options(options))
|
1044
1094
|
end
|
1045
|
-
|
1095
|
+
|
1046
1096
|
def hidden_field(method, options = {})
|
1047
1097
|
@emitted_hidden_id = true if method == :id
|
1048
1098
|
@template.hidden_field(@object_name, method, objectify_options(options))
|
1049
1099
|
end
|
1050
1100
|
|
1051
1101
|
def error_message_on(method, *args)
|
1052
|
-
@template.error_message_on(@object
|
1102
|
+
@template.error_message_on(@object, method, *args)
|
1053
1103
|
end
|
1054
1104
|
|
1055
1105
|
def error_messages(options = {})
|
1056
1106
|
@template.error_messages_for(@object_name, objectify_options(options))
|
1057
1107
|
end
|
1058
1108
|
|
1059
|
-
|
1109
|
+
# Add the submit button for the given form. When no value is given, it checks
|
1110
|
+
# if the object is a new resource or not to create the proper label:
|
1111
|
+
#
|
1112
|
+
# <% form_for @post do |f| %>
|
1113
|
+
# <%= f.submit %>
|
1114
|
+
# <% end %>
|
1115
|
+
#
|
1116
|
+
# In the example above, if @post is a new record, it will use "Create Post" as
|
1117
|
+
# submit button label, otherwise, it uses "Update Post".
|
1118
|
+
#
|
1119
|
+
# Those labels can be customized using I18n, under the helpers.submit key and accept
|
1120
|
+
# the {{model}} as translation interpolation:
|
1121
|
+
#
|
1122
|
+
# en:
|
1123
|
+
# helpers:
|
1124
|
+
# submit:
|
1125
|
+
# create: "Create a {{model}}"
|
1126
|
+
# update: "Confirm changes to {{model}}"
|
1127
|
+
#
|
1128
|
+
# It also searches for a key specific for the given object:
|
1129
|
+
#
|
1130
|
+
# en:
|
1131
|
+
# helpers:
|
1132
|
+
# submit:
|
1133
|
+
# post:
|
1134
|
+
# create: "Add {{model}}"
|
1135
|
+
#
|
1136
|
+
def submit(value=nil, options={})
|
1137
|
+
value, options = nil, value if value.is_a?(Hash)
|
1138
|
+
value ||= submit_default_value
|
1060
1139
|
@template.submit_tag(value, options.reverse_merge(:id => "#{object_name}_submit"))
|
1061
1140
|
end
|
1062
1141
|
|
@@ -1069,13 +1148,31 @@ module ActionView
|
|
1069
1148
|
@default_options.merge(options.merge(:object => @object))
|
1070
1149
|
end
|
1071
1150
|
|
1151
|
+
def submit_default_value
|
1152
|
+
object = @object.respond_to?(:to_model) ? @object.to_model : @object
|
1153
|
+
key = object ? (object.new_record? ? :create : :update) : :submit
|
1154
|
+
|
1155
|
+
model = if object.class.respond_to?(:model_name)
|
1156
|
+
object.class.model_name.human
|
1157
|
+
else
|
1158
|
+
@object_name.to_s.humanize
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
defaults = []
|
1162
|
+
defaults << :"helpers.submit.#{object_name}.#{key}"
|
1163
|
+
defaults << :"helpers.submit.#{key}"
|
1164
|
+
defaults << "#{key.to_s.humanize} #{model}"
|
1165
|
+
|
1166
|
+
I18n.t(defaults.shift, :model => model, :default => defaults)
|
1167
|
+
end
|
1168
|
+
|
1072
1169
|
def nested_attributes_association?(association_name)
|
1073
1170
|
@object.respond_to?("#{association_name}_attributes=")
|
1074
1171
|
end
|
1075
1172
|
|
1076
1173
|
def fields_for_with_nested_attributes(association_name, args, block)
|
1077
1174
|
name = "#{object_name}[#{association_name}_attributes]"
|
1078
|
-
association = args.first
|
1175
|
+
association = args.first.to_model if args.first.respond_to?(:to_model)
|
1079
1176
|
|
1080
1177
|
if association.respond_to?(:new_record?)
|
1081
1178
|
association = [association] if @object.send(association_name).is_a?(Array)
|
@@ -1113,6 +1210,6 @@ module ActionView
|
|
1113
1210
|
|
1114
1211
|
class Base
|
1115
1212
|
cattr_accessor :default_form_builder
|
1116
|
-
|
1213
|
+
@@default_form_builder = ::ActionView::Helpers::FormBuilder
|
1117
1214
|
end
|
1118
1215
|
end
|