omg-actionpack 8.0.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +129 -0
  3. data/MIT-LICENSE +21 -0
  4. data/README.rdoc +57 -0
  5. data/lib/abstract_controller/asset_paths.rb +14 -0
  6. data/lib/abstract_controller/base.rb +299 -0
  7. data/lib/abstract_controller/caching/fragments.rb +149 -0
  8. data/lib/abstract_controller/caching.rb +68 -0
  9. data/lib/abstract_controller/callbacks.rb +265 -0
  10. data/lib/abstract_controller/collector.rb +44 -0
  11. data/lib/abstract_controller/deprecator.rb +9 -0
  12. data/lib/abstract_controller/error.rb +8 -0
  13. data/lib/abstract_controller/helpers.rb +243 -0
  14. data/lib/abstract_controller/logger.rb +16 -0
  15. data/lib/abstract_controller/railties/routes_helpers.rb +25 -0
  16. data/lib/abstract_controller/rendering.rb +126 -0
  17. data/lib/abstract_controller/translation.rb +42 -0
  18. data/lib/abstract_controller/url_for.rb +37 -0
  19. data/lib/abstract_controller.rb +36 -0
  20. data/lib/action_controller/api/api_rendering.rb +18 -0
  21. data/lib/action_controller/api.rb +155 -0
  22. data/lib/action_controller/base.rb +332 -0
  23. data/lib/action_controller/caching.rb +49 -0
  24. data/lib/action_controller/deprecator.rb +9 -0
  25. data/lib/action_controller/form_builder.rb +55 -0
  26. data/lib/action_controller/log_subscriber.rb +96 -0
  27. data/lib/action_controller/metal/allow_browser.rb +123 -0
  28. data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
  29. data/lib/action_controller/metal/conditional_get.rb +341 -0
  30. data/lib/action_controller/metal/content_security_policy.rb +86 -0
  31. data/lib/action_controller/metal/cookies.rb +20 -0
  32. data/lib/action_controller/metal/data_streaming.rb +154 -0
  33. data/lib/action_controller/metal/default_headers.rb +21 -0
  34. data/lib/action_controller/metal/etag_with_flash.rb +22 -0
  35. data/lib/action_controller/metal/etag_with_template_digest.rb +59 -0
  36. data/lib/action_controller/metal/exceptions.rb +106 -0
  37. data/lib/action_controller/metal/flash.rb +67 -0
  38. data/lib/action_controller/metal/head.rb +67 -0
  39. data/lib/action_controller/metal/helpers.rb +129 -0
  40. data/lib/action_controller/metal/http_authentication.rb +565 -0
  41. data/lib/action_controller/metal/implicit_render.rb +67 -0
  42. data/lib/action_controller/metal/instrumentation.rb +120 -0
  43. data/lib/action_controller/metal/live.rb +398 -0
  44. data/lib/action_controller/metal/logging.rb +22 -0
  45. data/lib/action_controller/metal/mime_responds.rb +337 -0
  46. data/lib/action_controller/metal/parameter_encoding.rb +84 -0
  47. data/lib/action_controller/metal/params_wrapper.rb +312 -0
  48. data/lib/action_controller/metal/permissions_policy.rb +38 -0
  49. data/lib/action_controller/metal/rate_limiting.rb +62 -0
  50. data/lib/action_controller/metal/redirecting.rb +251 -0
  51. data/lib/action_controller/metal/renderers.rb +181 -0
  52. data/lib/action_controller/metal/rendering.rb +260 -0
  53. data/lib/action_controller/metal/request_forgery_protection.rb +667 -0
  54. data/lib/action_controller/metal/rescue.rb +33 -0
  55. data/lib/action_controller/metal/streaming.rb +183 -0
  56. data/lib/action_controller/metal/strong_parameters.rb +1546 -0
  57. data/lib/action_controller/metal/testing.rb +25 -0
  58. data/lib/action_controller/metal/url_for.rb +65 -0
  59. data/lib/action_controller/metal.rb +339 -0
  60. data/lib/action_controller/railtie.rb +149 -0
  61. data/lib/action_controller/railties/helpers.rb +26 -0
  62. data/lib/action_controller/renderer.rb +161 -0
  63. data/lib/action_controller/template_assertions.rb +13 -0
  64. data/lib/action_controller/test_case.rb +691 -0
  65. data/lib/action_controller.rb +80 -0
  66. data/lib/action_dispatch/constants.rb +34 -0
  67. data/lib/action_dispatch/deprecator.rb +9 -0
  68. data/lib/action_dispatch/http/cache.rb +249 -0
  69. data/lib/action_dispatch/http/content_disposition.rb +47 -0
  70. data/lib/action_dispatch/http/content_security_policy.rb +365 -0
  71. data/lib/action_dispatch/http/filter_parameters.rb +80 -0
  72. data/lib/action_dispatch/http/filter_redirect.rb +50 -0
  73. data/lib/action_dispatch/http/headers.rb +134 -0
  74. data/lib/action_dispatch/http/mime_negotiation.rb +187 -0
  75. data/lib/action_dispatch/http/mime_type.rb +389 -0
  76. data/lib/action_dispatch/http/mime_types.rb +54 -0
  77. data/lib/action_dispatch/http/parameters.rb +119 -0
  78. data/lib/action_dispatch/http/permissions_policy.rb +189 -0
  79. data/lib/action_dispatch/http/rack_cache.rb +67 -0
  80. data/lib/action_dispatch/http/request.rb +498 -0
  81. data/lib/action_dispatch/http/response.rb +556 -0
  82. data/lib/action_dispatch/http/upload.rb +107 -0
  83. data/lib/action_dispatch/http/url.rb +344 -0
  84. data/lib/action_dispatch/journey/formatter.rb +226 -0
  85. data/lib/action_dispatch/journey/gtg/builder.rb +149 -0
  86. data/lib/action_dispatch/journey/gtg/simulator.rb +50 -0
  87. data/lib/action_dispatch/journey/gtg/transition_table.rb +217 -0
  88. data/lib/action_dispatch/journey/nfa/dot.rb +27 -0
  89. data/lib/action_dispatch/journey/nodes/node.rb +208 -0
  90. data/lib/action_dispatch/journey/parser.rb +103 -0
  91. data/lib/action_dispatch/journey/path/pattern.rb +209 -0
  92. data/lib/action_dispatch/journey/route.rb +189 -0
  93. data/lib/action_dispatch/journey/router/utils.rb +105 -0
  94. data/lib/action_dispatch/journey/router.rb +151 -0
  95. data/lib/action_dispatch/journey/routes.rb +82 -0
  96. data/lib/action_dispatch/journey/scanner.rb +70 -0
  97. data/lib/action_dispatch/journey/visitors.rb +267 -0
  98. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  99. data/lib/action_dispatch/journey/visualizer/fsm.js +159 -0
  100. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  101. data/lib/action_dispatch/journey.rb +7 -0
  102. data/lib/action_dispatch/log_subscriber.rb +25 -0
  103. data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
  104. data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
  105. data/lib/action_dispatch/middleware/callbacks.rb +38 -0
  106. data/lib/action_dispatch/middleware/cookies.rb +719 -0
  107. data/lib/action_dispatch/middleware/debug_exceptions.rb +206 -0
  108. data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
  109. data/lib/action_dispatch/middleware/debug_view.rb +73 -0
  110. data/lib/action_dispatch/middleware/exception_wrapper.rb +350 -0
  111. data/lib/action_dispatch/middleware/executor.rb +32 -0
  112. data/lib/action_dispatch/middleware/flash.rb +318 -0
  113. data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
  114. data/lib/action_dispatch/middleware/public_exceptions.rb +64 -0
  115. data/lib/action_dispatch/middleware/reloader.rb +16 -0
  116. data/lib/action_dispatch/middleware/remote_ip.rb +199 -0
  117. data/lib/action_dispatch/middleware/request_id.rb +50 -0
  118. data/lib/action_dispatch/middleware/server_timing.rb +78 -0
  119. data/lib/action_dispatch/middleware/session/abstract_store.rb +112 -0
  120. data/lib/action_dispatch/middleware/session/cache_store.rb +66 -0
  121. data/lib/action_dispatch/middleware/session/cookie_store.rb +129 -0
  122. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +34 -0
  123. data/lib/action_dispatch/middleware/show_exceptions.rb +88 -0
  124. data/lib/action_dispatch/middleware/ssl.rb +180 -0
  125. data/lib/action_dispatch/middleware/stack.rb +194 -0
  126. data/lib/action_dispatch/middleware/static.rb +192 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
  128. data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +17 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +62 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  136. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
  137. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
  138. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +35 -0
  139. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  140. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
  141. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
  142. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +284 -0
  143. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
  144. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
  145. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  146. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  147. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  148. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  149. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  150. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  151. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  152. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  153. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +19 -0
  154. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +232 -0
  155. data/lib/action_dispatch/railtie.rb +77 -0
  156. data/lib/action_dispatch/request/session.rb +283 -0
  157. data/lib/action_dispatch/request/utils.rb +109 -0
  158. data/lib/action_dispatch/routing/endpoint.rb +19 -0
  159. data/lib/action_dispatch/routing/inspector.rb +323 -0
  160. data/lib/action_dispatch/routing/mapper.rb +2372 -0
  161. data/lib/action_dispatch/routing/polymorphic_routes.rb +363 -0
  162. data/lib/action_dispatch/routing/redirection.rb +218 -0
  163. data/lib/action_dispatch/routing/route_set.rb +958 -0
  164. data/lib/action_dispatch/routing/routes_proxy.rb +66 -0
  165. data/lib/action_dispatch/routing/url_for.rb +244 -0
  166. data/lib/action_dispatch/routing.rb +262 -0
  167. data/lib/action_dispatch/system_test_case.rb +206 -0
  168. data/lib/action_dispatch/system_testing/browser.rb +75 -0
  169. data/lib/action_dispatch/system_testing/driver.rb +85 -0
  170. data/lib/action_dispatch/system_testing/server.rb +33 -0
  171. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
  172. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
  173. data/lib/action_dispatch/testing/assertion_response.rb +48 -0
  174. data/lib/action_dispatch/testing/assertions/response.rb +114 -0
  175. data/lib/action_dispatch/testing/assertions/routing.rb +343 -0
  176. data/lib/action_dispatch/testing/assertions.rb +25 -0
  177. data/lib/action_dispatch/testing/integration.rb +694 -0
  178. data/lib/action_dispatch/testing/request_encoder.rb +60 -0
  179. data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
  180. data/lib/action_dispatch/testing/test_process.rb +57 -0
  181. data/lib/action_dispatch/testing/test_request.rb +73 -0
  182. data/lib/action_dispatch/testing/test_response.rb +58 -0
  183. data/lib/action_dispatch.rb +147 -0
  184. data/lib/action_pack/gem_version.rb +19 -0
  185. data/lib/action_pack/version.rb +12 -0
  186. data/lib/action_pack.rb +27 -0
  187. metadata +375 -0
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :markup: markdown
4
+
5
+ require "set"
6
+
7
+ module ActionController
8
+ # See Renderers.add
9
+ def self.add_renderer(key, &block)
10
+ Renderers.add(key, &block)
11
+ end
12
+
13
+ # See Renderers.remove
14
+ def self.remove_renderer(key)
15
+ Renderers.remove(key)
16
+ end
17
+
18
+ # See `Responder#api_behavior`
19
+ class MissingRenderer < LoadError
20
+ def initialize(format)
21
+ super "No renderer defined for format: #{format}"
22
+ end
23
+ end
24
+
25
+ module Renderers
26
+ extend ActiveSupport::Concern
27
+
28
+ # A Set containing renderer names that correspond to available renderer procs.
29
+ # Default values are `:json`, `:js`, `:xml`.
30
+ RENDERERS = Set.new
31
+
32
+ included do
33
+ class_attribute :_renderers, default: Set.new.freeze
34
+ end
35
+
36
+ # Used in ActionController::Base and ActionController::API to include all
37
+ # renderers by default.
38
+ module All
39
+ extend ActiveSupport::Concern
40
+ include Renderers
41
+
42
+ included do
43
+ self._renderers = RENDERERS
44
+ end
45
+ end
46
+
47
+ # Adds a new renderer to call within controller actions. A renderer is invoked
48
+ # by passing its name as an option to AbstractController::Rendering#render. To
49
+ # create a renderer pass it a name and a block. The block takes two arguments,
50
+ # the first is the value paired with its key and the second is the remaining
51
+ # hash of options passed to `render`.
52
+ #
53
+ # Create a csv renderer:
54
+ #
55
+ # ActionController::Renderers.add :csv do |obj, options|
56
+ # filename = options[:filename] || 'data'
57
+ # str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s
58
+ # send_data str, type: Mime[:csv],
59
+ # disposition: "attachment; filename=#{filename}.csv"
60
+ # end
61
+ #
62
+ # Note that we used [Mime](:csv) for the csv mime type as it comes with Rails.
63
+ # For a custom renderer, you'll need to register a mime type with
64
+ # `Mime::Type.register`.
65
+ #
66
+ # To use the csv renderer in a controller action:
67
+ #
68
+ # def show
69
+ # @csvable = Csvable.find(params[:id])
70
+ # respond_to do |format|
71
+ # format.html
72
+ # format.csv { render csv: @csvable, filename: @csvable.name }
73
+ # end
74
+ # end
75
+ def self.add(key, &block)
76
+ define_method(_render_with_renderer_method_name(key), &block)
77
+ RENDERERS << key.to_sym
78
+ end
79
+
80
+ # This method is the opposite of add method.
81
+ #
82
+ # To remove a csv renderer:
83
+ #
84
+ # ActionController::Renderers.remove(:csv)
85
+ def self.remove(key)
86
+ RENDERERS.delete(key.to_sym)
87
+ method_name = _render_with_renderer_method_name(key)
88
+ remove_possible_method(method_name)
89
+ end
90
+
91
+ def self._render_with_renderer_method_name(key)
92
+ "_render_with_renderer_#{key}"
93
+ end
94
+
95
+ module ClassMethods
96
+ # Adds, by name, a renderer or renderers to the `_renderers` available to call
97
+ # within controller actions.
98
+ #
99
+ # It is useful when rendering from an ActionController::Metal controller or
100
+ # otherwise to add an available renderer proc to a specific controller.
101
+ #
102
+ # Both ActionController::Base and ActionController::API include
103
+ # ActionController::Renderers::All, making all renderers available in the
104
+ # controller. See Renderers::RENDERERS and Renderers.add.
105
+ #
106
+ # Since ActionController::Metal controllers cannot render, the controller must
107
+ # include AbstractController::Rendering, ActionController::Rendering, and
108
+ # ActionController::Renderers, and have at least one renderer.
109
+ #
110
+ # Rather than including ActionController::Renderers::All and including all
111
+ # renderers, you may specify which renderers to include by passing the renderer
112
+ # name or names to `use_renderers`. For example, a controller that includes only
113
+ # the `:json` renderer (`_render_with_renderer_json`) might look like:
114
+ #
115
+ # class MetalRenderingController < ActionController::Metal
116
+ # include AbstractController::Rendering
117
+ # include ActionController::Rendering
118
+ # include ActionController::Renderers
119
+ #
120
+ # use_renderers :json
121
+ #
122
+ # def show
123
+ # render json: record
124
+ # end
125
+ # end
126
+ #
127
+ # You must specify a `use_renderer`, else the `controller.renderer` and
128
+ # `controller._renderers` will be `nil`, and the action will fail.
129
+ def use_renderers(*args)
130
+ renderers = _renderers + args
131
+ self._renderers = renderers.freeze
132
+ end
133
+ alias use_renderer use_renderers
134
+ end
135
+
136
+ # Called by `render` in AbstractController::Rendering which sets the return
137
+ # value as the `response_body`.
138
+ #
139
+ # If no renderer is found, `super` returns control to
140
+ # `ActionView::Rendering.render_to_body`, if present.
141
+ def render_to_body(options)
142
+ _render_to_body_with_renderer(options) || super
143
+ end
144
+
145
+ def _render_to_body_with_renderer(options)
146
+ _renderers.each do |name|
147
+ if options.key?(name)
148
+ _process_options(options)
149
+ method_name = Renderers._render_with_renderer_method_name(name)
150
+ return send(method_name, options.delete(name), options)
151
+ end
152
+ end
153
+ nil
154
+ end
155
+
156
+ add :json do |json, options|
157
+ json = json.to_json(options) unless json.kind_of?(String)
158
+
159
+ if options[:callback].present?
160
+ if media_type.nil? || media_type == Mime[:json]
161
+ self.content_type = Mime[:js]
162
+ end
163
+
164
+ "/**/#{options[:callback]}(#{json})"
165
+ else
166
+ self.content_type = Mime[:json] if media_type.nil?
167
+ json
168
+ end
169
+ end
170
+
171
+ add :js do |js, options|
172
+ self.content_type = Mime[:js] if media_type.nil?
173
+ js.respond_to?(:to_js) ? js.to_js(options) : js
174
+ end
175
+
176
+ add :xml do |xml, options|
177
+ self.content_type = Mime[:xml] if media_type.nil?
178
+ xml.respond_to?(:to_xml) ? xml.to_xml(options) : xml
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,260 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :markup: markdown
4
+
5
+ module ActionController
6
+ module Rendering
7
+ extend ActiveSupport::Concern
8
+
9
+ RENDER_FORMATS_IN_PRIORITY = [:body, :plain, :html]
10
+
11
+ module ClassMethods
12
+ # Documentation at ActionController::Renderer#render
13
+ delegate :render, to: :renderer
14
+
15
+ # Returns a renderer instance (inherited from ActionController::Renderer) for
16
+ # the controller.
17
+ attr_reader :renderer
18
+
19
+ def setup_renderer! # :nodoc:
20
+ @renderer = Renderer.for(self)
21
+ end
22
+
23
+ def inherited(klass)
24
+ klass.setup_renderer!
25
+ super
26
+ end
27
+ end
28
+
29
+ # Renders a template and assigns the result to `self.response_body`.
30
+ #
31
+ # If no rendering mode option is specified, the template will be derived from
32
+ # the first argument.
33
+ #
34
+ # render "posts/show"
35
+ # # => renders app/views/posts/show.html.erb
36
+ #
37
+ # # In a PostsController action...
38
+ # render :show
39
+ # # => renders app/views/posts/show.html.erb
40
+ #
41
+ # If the first argument responds to `render_in`, the template will be rendered
42
+ # by calling `render_in` with the current view context.
43
+ #
44
+ # class Greeting
45
+ # def render_in(view_context)
46
+ # view_context.render html: "<h1>Hello, World</h1>"
47
+ # end
48
+ #
49
+ # def format
50
+ # :html
51
+ # end
52
+ # end
53
+ #
54
+ # render(Greeting.new)
55
+ # # => "<h1>Hello, World</h1>"
56
+ #
57
+ # render(renderable: Greeting.new)
58
+ # # => "<h1>Hello, World</h1>"
59
+ #
60
+ # #### Rendering Mode
61
+ #
62
+ # `:partial`
63
+ # : See ActionView::PartialRenderer for details.
64
+ #
65
+ # render partial: "posts/form", locals: { post: Post.new }
66
+ # # => renders app/views/posts/_form.html.erb
67
+ #
68
+ # `:file`
69
+ # : Renders the contents of a file. This option should **not** be used with
70
+ # unsanitized user input.
71
+ #
72
+ # render file: "/path/to/some/file"
73
+ # # => renders /path/to/some/file
74
+ #
75
+ # `:inline`
76
+ # : Renders an ERB template string.
77
+ #
78
+ # @name = "World"
79
+ # render inline: "<h1>Hello, <%= @name %>!</h1>"
80
+ # # => renders "<h1>Hello, World!</h1>"
81
+ #
82
+ # `:body`
83
+ # : Renders the provided text, and sets the content type as `text/plain`.
84
+ #
85
+ # render body: "Hello, World!"
86
+ # # => renders "Hello, World!"
87
+ #
88
+ # `:plain`
89
+ # : Renders the provided text, and sets the content type as `text/plain`.
90
+ #
91
+ # render plain: "Hello, World!"
92
+ # # => renders "Hello, World!"
93
+ #
94
+ # `:html`
95
+ # : Renders the provided HTML string, and sets the content type as
96
+ # `text/html`. If the string is not `html_safe?`, performs HTML escaping on
97
+ # the string before rendering.
98
+ #
99
+ # render html: "<h1>Hello, World!</h1>".html_safe
100
+ # # => renders "<h1>Hello, World!</h1>"
101
+ #
102
+ # render html: "<h1>Hello, World!</h1>"
103
+ # # => renders "&lt;h1&gt;Hello, World!&lt;/h1&gt;"
104
+ #
105
+ # `:json`
106
+ # : Renders the provided object as JSON, and sets the content type as
107
+ # `application/json`. If the object is not a string, it will be converted to
108
+ # JSON by calling `to_json`.
109
+ #
110
+ # render json: { hello: "world" }
111
+ # # => renders "{\"hello\":\"world\"}"
112
+ #
113
+ # `:renderable`
114
+ # : Renders the provided object by calling `render_in` with the current view
115
+ # context. The response format is determined by calling `format` on the
116
+ # renderable if it responds to `format`, falling back to `text/html` by
117
+ # default.
118
+ #
119
+ # render renderable: Greeting.new
120
+ # # => renders "<h1>Hello, World</h1>"
121
+ #
122
+ #
123
+ # By default, when a rendering mode is specified, no layout template is
124
+ # rendered.
125
+ #
126
+ # #### Options
127
+ #
128
+ # `:assigns`
129
+ # : Hash of instance variable assignments for the template.
130
+ #
131
+ # render inline: "<h1>Hello, <%= @name %>!</h1>", assigns: { name: "World" }
132
+ # # => renders "<h1>Hello, World!</h1>"
133
+ #
134
+ # `:locals`
135
+ # : Hash of local variable assignments for the template.
136
+ #
137
+ # render inline: "<h1>Hello, <%= name %>!</h1>", locals: { name: "World" }
138
+ # # => renders "<h1>Hello, World!</h1>"
139
+ #
140
+ # `:layout`
141
+ # : The layout template to render. Can also be `false` or `true` to disable or
142
+ # (re)enable the default layout template.
143
+ #
144
+ # render "posts/show", layout: "holiday"
145
+ # # => renders app/views/posts/show.html.erb with the app/views/layouts/holiday.html.erb layout
146
+ #
147
+ # render "posts/show", layout: false
148
+ # # => renders app/views/posts/show.html.erb with no layout
149
+ #
150
+ # render inline: "<h1>Hello, World!</h1>", layout: true
151
+ # # => renders "<h1>Hello, World!</h1>" with the default layout
152
+ #
153
+ # `:status`
154
+ # : The HTTP status code to send with the response. Can be specified as a
155
+ # number or as the status name in Symbol form. Defaults to 200.
156
+ #
157
+ # render "posts/new", status: 422
158
+ # # => renders app/views/posts/new.html.erb with HTTP status code 422
159
+ #
160
+ # render "posts/new", status: :unprocessable_entity
161
+ # # => renders app/views/posts/new.html.erb with HTTP status code 422
162
+ #
163
+ #--
164
+ # Check for double render errors and set the content_type after rendering.
165
+ def render(*args)
166
+ raise ::AbstractController::DoubleRenderError if response_body
167
+ super
168
+ end
169
+
170
+ # Similar to #render, but only returns the rendered template as a string,
171
+ # instead of setting `self.response_body`.
172
+ #--
173
+ # Override render_to_string because body can now be set to a Rack body.
174
+ def render_to_string(*)
175
+ result = super
176
+ if result.respond_to?(:each)
177
+ string = +""
178
+ result.each { |r| string << r }
179
+ string
180
+ else
181
+ result
182
+ end
183
+ end
184
+
185
+ def render_to_body(options = {}) # :nodoc:
186
+ super || _render_in_priorities(options) || " "
187
+ end
188
+
189
+ private
190
+ # Before processing, set the request formats in current controller formats.
191
+ def process_action(*) # :nodoc:
192
+ self.formats = request.formats.filter_map(&:ref)
193
+ super
194
+ end
195
+
196
+ def _process_variant(options)
197
+ if defined?(request) && !request.nil? && request.variant.present?
198
+ options[:variant] = request.variant
199
+ end
200
+ end
201
+
202
+ def _render_in_priorities(options)
203
+ RENDER_FORMATS_IN_PRIORITY.each do |format|
204
+ return options[format] if options.key?(format)
205
+ end
206
+
207
+ nil
208
+ end
209
+
210
+ def _set_html_content_type
211
+ self.content_type = Mime[:html].to_s
212
+ end
213
+
214
+ def _set_rendered_content_type(format)
215
+ if format && !response.media_type
216
+ self.content_type = format.to_s
217
+ end
218
+ end
219
+
220
+ def _set_vary_header
221
+ if response.headers["Vary"].blank? && request.should_apply_vary_header?
222
+ response.headers["Vary"] = "Accept"
223
+ end
224
+ end
225
+
226
+ # Normalize both text and status options.
227
+ def _normalize_options(options)
228
+ _normalize_text(options)
229
+
230
+ if options[:html]
231
+ options[:html] = ERB::Util.html_escape(options[:html])
232
+ end
233
+
234
+ if options[:status]
235
+ options[:status] = Rack::Utils.status_code(options[:status])
236
+ end
237
+
238
+ super
239
+ end
240
+
241
+ def _normalize_text(options)
242
+ RENDER_FORMATS_IN_PRIORITY.each do |format|
243
+ if options.key?(format) && options[format].respond_to?(:to_text)
244
+ options[format] = options[format].to_text
245
+ end
246
+ end
247
+ end
248
+
249
+ # Process controller specific options, as status, content-type and location.
250
+ def _process_options(options)
251
+ status, content_type, location = options.values_at(:status, :content_type, :location)
252
+
253
+ self.status = status if status
254
+ self.content_type = content_type if content_type
255
+ headers["Location"] = url_for(location) if location
256
+
257
+ super
258
+ end
259
+ end
260
+ end