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.

Files changed (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. 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
- @controller.fragment_for(output_buffer, name, options, &block)
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
- instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe)
122
- nil
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 = '') #:nodoc:
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 cross-site request forgery protection token
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="#{h(request_forgery_protection_token)}"/>\n<meta name="csrf-token" content="#{h(form_authenticity_token)}"/>).html_safe
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+). You can
123
- # the output in the +options+ hash.
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 the abbreviated month name instead of the full
129
- # name (e.g. "Feb" instead of "February").
130
- # * <tt>:add_month_number</tt> - Set to true if you want to show both, the month's number and name (e.g.
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' new i18n functionality for this.
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> do
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+). Examples:
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
- (select_options.join("\n") + "\n").html_safe
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.html_safe, select_options) + "\n").html_safe
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
- }.merge(@html_options.slice(:disabled))) + "\n").html_safe
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[:discard_minute] ? "" : @options[:time_separator]
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 defined?(@auto_index) && @auto_index && !options.has_key?(:index)
938
+ options[:index] = @auto_index if @auto_index && !options.has_key?(:index)
940
939
  options[:datetime_separator] ||= ' &mdash; '
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
- concat('</form>'.html_safe)
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>_destroy</tt> parameter,
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 :_destroy %>
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>_destroy</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 :_destroy %>
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 views.labels.<modelname>.<attribute>) or you specify it explicitly.
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
- # views:
517
- # labels:
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
- # activerecord:
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
- class InstanceTag #:nodoc:
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
- i18n_label = I18n.t("helpers.label.#{object_name}.#{method_name}", :default => "")
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"] = field_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
- add_default_name_and_id(options)
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
- class << self
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, line = <<-end_src, __LINE__ + 1
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__, line
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 || @object_name, method, *args)
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
- def submit(value = "Save changes", options = {})
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
- self.default_form_builder = ::ActionView::Helpers::FormBuilder
1213
+ @@default_form_builder = ::ActionView::Helpers::FormBuilder
1117
1214
  end
1118
1215
  end