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
@@ -0,0 +1,300 @@
1
+ require 'abstract_controller/collector'
2
+ require 'active_support/core_ext/class/attribute'
3
+
4
+ module ActionController #:nodoc:
5
+ module MimeResponds #:nodoc:
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ class_attribute :responder, :mimes_for_respond_to
10
+ self.responder = ActionController::Responder
11
+ clear_respond_to
12
+ end
13
+
14
+ module ClassMethods
15
+ # Defines mimes that are rendered by default when invoking respond_with.
16
+ #
17
+ # Examples:
18
+ #
19
+ # respond_to :html, :xml, :json
20
+ #
21
+ # All actions on your controller will respond to :html, :xml and :json.
22
+ #
23
+ # But if you want to specify it based on your actions, you can use only and
24
+ # except:
25
+ #
26
+ # respond_to :html
27
+ # respond_to :xml, :json, :except => [ :edit ]
28
+ #
29
+ # The definition above explicits that all actions respond to :html. And all
30
+ # actions except :edit respond to :xml and :json.
31
+ #
32
+ # You can specify also only parameters:
33
+ #
34
+ # respond_to :rjs, :only => :create
35
+ #
36
+ def respond_to(*mimes)
37
+ options = mimes.extract_options!
38
+
39
+ only_actions = Array(options.delete(:only))
40
+ except_actions = Array(options.delete(:except))
41
+
42
+ new = mimes_for_respond_to.dup
43
+ mimes.each do |mime|
44
+ mime = mime.to_sym
45
+ new[mime] = {}
46
+ new[mime][:only] = only_actions unless only_actions.empty?
47
+ new[mime][:except] = except_actions unless except_actions.empty?
48
+ end
49
+ self.mimes_for_respond_to = new.freeze
50
+ end
51
+
52
+ # Clear all mimes in respond_to.
53
+ #
54
+ def clear_respond_to
55
+ self.mimes_for_respond_to = ActiveSupport::OrderedHash.new.freeze
56
+ end
57
+ end
58
+
59
+ # Without web-service support, an action which collects the data for displaying a list of people
60
+ # might look something like this:
61
+ #
62
+ # def index
63
+ # @people = Person.find(:all)
64
+ # end
65
+ #
66
+ # Here's the same action, with web-service support baked in:
67
+ #
68
+ # def index
69
+ # @people = Person.find(:all)
70
+ #
71
+ # respond_to do |format|
72
+ # format.html
73
+ # format.xml { render :xml => @people.to_xml }
74
+ # end
75
+ # end
76
+ #
77
+ # What that says is, "if the client wants HTML in response to this action, just respond as we
78
+ # would have before, but if the client wants XML, return them the list of people in XML format."
79
+ # (Rails determines the desired response format from the HTTP Accept header submitted by the client.)
80
+ #
81
+ # Supposing you have an action that adds a new person, optionally creating their company
82
+ # (by name) if it does not already exist, without web-services, it might look like this:
83
+ #
84
+ # def create
85
+ # @company = Company.find_or_create_by_name(params[:company][:name])
86
+ # @person = @company.people.create(params[:person])
87
+ #
88
+ # redirect_to(person_list_url)
89
+ # end
90
+ #
91
+ # Here's the same action, with web-service support baked in:
92
+ #
93
+ # def create
94
+ # company = params[:person].delete(:company)
95
+ # @company = Company.find_or_create_by_name(company[:name])
96
+ # @person = @company.people.create(params[:person])
97
+ #
98
+ # respond_to do |format|
99
+ # format.html { redirect_to(person_list_url) }
100
+ # format.js
101
+ # format.xml { render :xml => @person.to_xml(:include => @company) }
102
+ # end
103
+ # end
104
+ #
105
+ # If the client wants HTML, we just redirect them back to the person list. If they want Javascript
106
+ # (format.js), then it is an RJS request and we render the RJS template associated with this action.
107
+ # Lastly, if the client wants XML, we render the created person as XML, but with a twist: we also
108
+ # include the person's company in the rendered XML, so you get something like this:
109
+ #
110
+ # <person>
111
+ # <id>...</id>
112
+ # ...
113
+ # <company>
114
+ # <id>...</id>
115
+ # <name>...</name>
116
+ # ...
117
+ # </company>
118
+ # </person>
119
+ #
120
+ # Note, however, the extra bit at the top of that action:
121
+ #
122
+ # company = params[:person].delete(:company)
123
+ # @company = Company.find_or_create_by_name(company[:name])
124
+ #
125
+ # This is because the incoming XML document (if a web-service request is in process) can only contain a
126
+ # single root-node. So, we have to rearrange things so that the request looks like this (url-encoded):
127
+ #
128
+ # person[name]=...&person[company][name]=...&...
129
+ #
130
+ # And, like this (xml-encoded):
131
+ #
132
+ # <person>
133
+ # <name>...</name>
134
+ # <company>
135
+ # <name>...</name>
136
+ # </company>
137
+ # </person>
138
+ #
139
+ # In other words, we make the request so that it operates on a single entity's person. Then, in the action,
140
+ # we extract the company data from the request, find or create the company, and then create the new person
141
+ # with the remaining data.
142
+ #
143
+ # Note that you can define your own XML parameter parser which would allow you to describe multiple entities
144
+ # in a single request (i.e., by wrapping them all in a single root node), but if you just go with the flow
145
+ # and accept Rails' defaults, life will be much easier.
146
+ #
147
+ # If you need to use a MIME type which isn't supported by default, you can register your own handlers in
148
+ # environment.rb as follows.
149
+ #
150
+ # Mime::Type.register "image/jpg", :jpg
151
+ #
152
+ # Respond to also allows you to specify a common block for different formats by using any:
153
+ #
154
+ # def index
155
+ # @people = Person.find(:all)
156
+ #
157
+ # respond_to do |format|
158
+ # format.html
159
+ # format.any(:xml, :json) { render request.format.to_sym => @people }
160
+ # end
161
+ # end
162
+ #
163
+ # In the example above, if the format is xml, it will render:
164
+ #
165
+ # render :xml => @people
166
+ #
167
+ # Or if the format is json:
168
+ #
169
+ # render :json => @people
170
+ #
171
+ # Since this is a common pattern, you can use the class method respond_to
172
+ # with the respond_with method to have the same results:
173
+ #
174
+ # class PeopleController < ApplicationController
175
+ # respond_to :html, :xml, :json
176
+ #
177
+ # def index
178
+ # @people = Person.find(:all)
179
+ # respond_with(@person)
180
+ # end
181
+ # end
182
+ #
183
+ # Be sure to check respond_with and respond_to documentation for more examples.
184
+ #
185
+ def respond_to(*mimes, &block)
186
+ raise ArgumentError, "respond_to takes either types or a block, never both" if mimes.any? && block_given?
187
+
188
+ if response = retrieve_response_from_mimes(mimes, &block)
189
+ response.call
190
+ end
191
+ end
192
+
193
+ # respond_with wraps a resource around a responder for default representation.
194
+ # First it invokes respond_to, if a response cannot be found (ie. no block
195
+ # for the request was given and template was not available), it instantiates
196
+ # an ActionController::Responder with the controller and resource.
197
+ #
198
+ # ==== Example
199
+ #
200
+ # def index
201
+ # @users = User.all
202
+ # respond_with(@users)
203
+ # end
204
+ #
205
+ # It also accepts a block to be given. It's used to overwrite a default
206
+ # response:
207
+ #
208
+ # def destroy
209
+ # @user = User.find(params[:id])
210
+ # flash[:notice] = "User was successfully created." if @user.save
211
+ #
212
+ # respond_with(@user) do |format|
213
+ # format.html { render }
214
+ # end
215
+ # end
216
+ #
217
+ # All options given to respond_with are sent to the underlying responder,
218
+ # except for the option :responder itself. Since the responder interface
219
+ # is quite simple (it just needs to respond to call), you can even give
220
+ # a proc to it.
221
+ #
222
+ def respond_with(*resources, &block)
223
+ raise "In order to use respond_with, first you need to declare the formats your " <<
224
+ "controller responds to in the class level" if self.class.mimes_for_respond_to.empty?
225
+
226
+ if response = retrieve_response_from_mimes(&block)
227
+ options = resources.extract_options!
228
+ options.merge!(:default_response => response)
229
+ (options.delete(:responder) || self.class.responder).call(self, resources, options)
230
+ end
231
+ end
232
+
233
+ protected
234
+
235
+ # Collect mimes declared in the class method respond_to valid for the
236
+ # current action.
237
+ #
238
+ def collect_mimes_from_class_level #:nodoc:
239
+ action = action_name.to_sym
240
+
241
+ self.class.mimes_for_respond_to.keys.select do |mime|
242
+ config = self.class.mimes_for_respond_to[mime]
243
+
244
+ if config[:except]
245
+ !config[:except].include?(action)
246
+ elsif config[:only]
247
+ config[:only].include?(action)
248
+ else
249
+ true
250
+ end
251
+ end
252
+ end
253
+
254
+ # Collects mimes and return the response for the negotiated format. Returns
255
+ # nil if :not_acceptable was sent to the client.
256
+ #
257
+ def retrieve_response_from_mimes(mimes=nil, &block)
258
+ collector = Collector.new { default_render }
259
+ mimes ||= collect_mimes_from_class_level
260
+ mimes.each { |mime| collector.send(mime) }
261
+ block.call(collector) if block_given?
262
+
263
+ if format = request.negotiate_mime(collector.order)
264
+ self.formats = [format.to_sym]
265
+ collector.response_for(format)
266
+ else
267
+ head :not_acceptable
268
+ nil
269
+ end
270
+ end
271
+
272
+ class Collector #:nodoc:
273
+ include AbstractController::Collector
274
+ attr_accessor :order
275
+
276
+ def initialize(&block)
277
+ @order, @responses, @default_response = [], {}, block
278
+ end
279
+
280
+ def any(*args, &block)
281
+ if args.any?
282
+ args.each { |type| send(type, &block) }
283
+ else
284
+ custom(Mime::ALL, &block)
285
+ end
286
+ end
287
+ alias :all :any
288
+
289
+ def custom(mime_type, &block)
290
+ mime_type = mime_type.is_a?(Mime::Type) ? mime_type : Mime::Type.lookup(mime_type.to_s)
291
+ @order << mime_type
292
+ @responses[mime_type] ||= block
293
+ end
294
+
295
+ def response_for(mime)
296
+ @responses[mime] || @responses[Mime::ALL] || @default_response
297
+ end
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,35 @@
1
+ require 'action_dispatch/http/request'
2
+ require 'action_dispatch/http/response'
3
+
4
+ module ActionController
5
+ module RackDelegation
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ delegate :session, :to => "@_request"
10
+ delegate :headers, :status=, :location=, :content_type=,
11
+ :status, :location, :content_type, :to => "@_response"
12
+ attr_internal :request
13
+ end
14
+
15
+ def dispatch(action, env)
16
+ @_request = ActionDispatch::Request.new(env)
17
+ @_response = ActionDispatch::Response.new
18
+ @_response.request = request
19
+ super
20
+ end
21
+
22
+ def params
23
+ @_params ||= @_request.parameters
24
+ end
25
+
26
+ def response_body=(body)
27
+ response.body = body if response
28
+ super
29
+ end
30
+
31
+ def reset_session
32
+ @_request.reset_session
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,90 @@
1
+ module ActionController
2
+ class RedirectBackError < AbstractController::Error #:nodoc:
3
+ DEFAULT_MESSAGE = 'No HTTP_REFERER was set in the request to this action, so redirect_to :back could not be called successfully. If this is a test, make sure to specify request.env["HTTP_REFERER"].'
4
+
5
+ def initialize(message = nil)
6
+ super(message || DEFAULT_MESSAGE)
7
+ end
8
+ end
9
+
10
+ module Redirecting
11
+ extend ActiveSupport::Concern
12
+
13
+ include AbstractController::Logger
14
+ include ActionController::UrlFor
15
+
16
+ # Redirects the browser to the target specified in +options+. This parameter can take one of three forms:
17
+ #
18
+ # * <tt>Hash</tt> - The URL will be generated by calling url_for with the +options+.
19
+ # * <tt>Record</tt> - The URL will be generated by calling url_for with the +options+, which will reference a named URL for that record.
20
+ # * <tt>String</tt> starting with <tt>protocol://</tt> (like <tt>http://</tt>) - Is passed straight through as the target for redirection.
21
+ # * <tt>String</tt> not containing a protocol - The current protocol and host is prepended to the string.
22
+ # * <tt>:back</tt> - Back to the page that issued the request. Useful for forms that are triggered from multiple places.
23
+ # Short-hand for <tt>redirect_to(request.env["HTTP_REFERER"])</tt>
24
+ #
25
+ # Examples:
26
+ # redirect_to :action => "show", :id => 5
27
+ # redirect_to post
28
+ # redirect_to "http://www.rubyonrails.org"
29
+ # redirect_to "/images/screenshot.jpg"
30
+ # redirect_to articles_url
31
+ # redirect_to :back
32
+ #
33
+ # The redirection happens as a "302 Moved" header unless otherwise specified.
34
+ #
35
+ # Examples:
36
+ # redirect_to post_url(@post), :status => :found
37
+ # redirect_to :action=>'atom', :status => :moved_permanently
38
+ # redirect_to post_url(@post), :status => 301
39
+ # redirect_to :action=>'atom', :status => 302
40
+ #
41
+ # It is also possible to assign a flash message as part of the redirection. There are two special accessors for commonly used the flash names
42
+ # +alert+ and +notice+ as well as a general purpose +flash+ bucket.
43
+ #
44
+ # Examples:
45
+ # redirect_to post_url(@post), :alert => "Watch it, mister!"
46
+ # redirect_to post_url(@post), :status=> :found, :notice => "Pay attention to the road"
47
+ # redirect_to post_url(@post), :status => 301, :flash => { :updated_post_id => @post.id }
48
+ # redirect_to { :action=>'atom' }, :alert => "Something serious happened"
49
+ #
50
+ # When using <tt>redirect_to :back</tt>, if there is no referrer,
51
+ # RedirectBackError will be raised. You may specify some fallback
52
+ # behavior for this case by rescuing RedirectBackError.
53
+ def redirect_to(options = {}, response_status = {}) #:doc:
54
+ raise ActionControllerError.new("Cannot redirect to nil!") if options.nil?
55
+ raise AbstractController::DoubleRenderError if response_body
56
+
57
+ self.status = _extract_redirect_to_status(options, response_status)
58
+ self.location = _compute_redirect_to_location(options)
59
+ self.response_body = "<html><body>You are being <a href=\"#{ERB::Util.h(location)}\">redirected</a>.</body></html>"
60
+ end
61
+
62
+ private
63
+ def _extract_redirect_to_status(options, response_status)
64
+ status = if options.is_a?(Hash) && options.key?(:status)
65
+ Rack::Utils.status_code(options.delete(:status))
66
+ elsif response_status.key?(:status)
67
+ Rack::Utils.status_code(response_status[:status])
68
+ else
69
+ 302
70
+ end
71
+ end
72
+
73
+ def _compute_redirect_to_location(options)
74
+ case options
75
+ # The scheme name consist of a letter followed by any combination of
76
+ # letters, digits, and the plus ("+"), period ("."), or hyphen ("-")
77
+ # characters; and is terminated by a colon (":").
78
+ when %r{^\w[\w\d+.-]*:.*}
79
+ options
80
+ when String
81
+ request.protocol + request.host_with_port + options
82
+ when :back
83
+ raise RedirectBackError unless refer = request.headers["Referer"]
84
+ refer
85
+ else
86
+ url_for(options)
87
+ end.gsub(/[\r\n]/, '')
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,95 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+
3
+ module ActionController
4
+ def self.add_renderer(key, &block)
5
+ Renderers.add(key, &block)
6
+ end
7
+
8
+ module Renderers
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ class_attribute :_renderers
13
+ self._renderers = {}.freeze
14
+ end
15
+
16
+ module ClassMethods
17
+ def _write_render_options
18
+ renderers = _renderers.map do |name, value|
19
+ <<-RUBY_EVAL
20
+ if options.key?(:#{name})
21
+ _process_options(options)
22
+ return _render_option_#{name}(options[:#{name}], options)
23
+ end
24
+ RUBY_EVAL
25
+ end
26
+
27
+ class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
28
+ def _handle_render_options(options)
29
+ #{renderers.join}
30
+ end
31
+ RUBY_EVAL
32
+ end
33
+
34
+ def use_renderers(*args)
35
+ new = _renderers.dup
36
+ args.each do |key|
37
+ new[key] = RENDERERS[key]
38
+ end
39
+ self._renderers = new.freeze
40
+ _write_render_options
41
+ end
42
+ alias use_renderer use_renderers
43
+ end
44
+
45
+ def render_to_body(options)
46
+ _handle_render_options(options) || super
47
+ end
48
+
49
+ RENDERERS = {}
50
+ def self.add(key, &block)
51
+ define_method("_render_option_#{key}", &block)
52
+ RENDERERS[key] = block
53
+ All._write_render_options
54
+ end
55
+
56
+ module All
57
+ extend ActiveSupport::Concern
58
+ include Renderers
59
+
60
+ INCLUDED = []
61
+ included do
62
+ self._renderers = RENDERERS
63
+ _write_render_options
64
+ INCLUDED << self
65
+ end
66
+
67
+ def self._write_render_options
68
+ INCLUDED.each(&:_write_render_options)
69
+ end
70
+ end
71
+
72
+ add :json do |json, options|
73
+ json = ActiveSupport::JSON.encode(json) unless json.respond_to?(:to_str)
74
+ json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
75
+ self.content_type ||= Mime::JSON
76
+ self.response_body = json
77
+ end
78
+
79
+ add :js do |js, options|
80
+ self.content_type ||= Mime::JS
81
+ self.response_body = js.respond_to?(:to_js) ? js.to_js : js
82
+ end
83
+
84
+ add :xml do |xml, options|
85
+ self.content_type ||= Mime::XML
86
+ self.response_body = xml.respond_to?(:to_xml) ? xml.to_xml : xml
87
+ end
88
+
89
+ add :update do |proc, options|
90
+ generator = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(view_context, &proc)
91
+ self.content_type = Mime::JS
92
+ self.response_body = generator.to_s
93
+ end
94
+ end
95
+ end