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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +129 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +57 -0
- data/lib/abstract_controller/asset_paths.rb +14 -0
- data/lib/abstract_controller/base.rb +299 -0
- data/lib/abstract_controller/caching/fragments.rb +149 -0
- data/lib/abstract_controller/caching.rb +68 -0
- data/lib/abstract_controller/callbacks.rb +265 -0
- data/lib/abstract_controller/collector.rb +44 -0
- data/lib/abstract_controller/deprecator.rb +9 -0
- data/lib/abstract_controller/error.rb +8 -0
- data/lib/abstract_controller/helpers.rb +243 -0
- data/lib/abstract_controller/logger.rb +16 -0
- data/lib/abstract_controller/railties/routes_helpers.rb +25 -0
- data/lib/abstract_controller/rendering.rb +126 -0
- data/lib/abstract_controller/translation.rb +42 -0
- data/lib/abstract_controller/url_for.rb +37 -0
- data/lib/abstract_controller.rb +36 -0
- data/lib/action_controller/api/api_rendering.rb +18 -0
- data/lib/action_controller/api.rb +155 -0
- data/lib/action_controller/base.rb +332 -0
- data/lib/action_controller/caching.rb +49 -0
- data/lib/action_controller/deprecator.rb +9 -0
- data/lib/action_controller/form_builder.rb +55 -0
- data/lib/action_controller/log_subscriber.rb +96 -0
- data/lib/action_controller/metal/allow_browser.rb +123 -0
- data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
- data/lib/action_controller/metal/conditional_get.rb +341 -0
- data/lib/action_controller/metal/content_security_policy.rb +86 -0
- data/lib/action_controller/metal/cookies.rb +20 -0
- data/lib/action_controller/metal/data_streaming.rb +154 -0
- data/lib/action_controller/metal/default_headers.rb +21 -0
- data/lib/action_controller/metal/etag_with_flash.rb +22 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +59 -0
- data/lib/action_controller/metal/exceptions.rb +106 -0
- data/lib/action_controller/metal/flash.rb +67 -0
- data/lib/action_controller/metal/head.rb +67 -0
- data/lib/action_controller/metal/helpers.rb +129 -0
- data/lib/action_controller/metal/http_authentication.rb +565 -0
- data/lib/action_controller/metal/implicit_render.rb +67 -0
- data/lib/action_controller/metal/instrumentation.rb +120 -0
- data/lib/action_controller/metal/live.rb +398 -0
- data/lib/action_controller/metal/logging.rb +22 -0
- data/lib/action_controller/metal/mime_responds.rb +337 -0
- data/lib/action_controller/metal/parameter_encoding.rb +84 -0
- data/lib/action_controller/metal/params_wrapper.rb +312 -0
- data/lib/action_controller/metal/permissions_policy.rb +38 -0
- data/lib/action_controller/metal/rate_limiting.rb +62 -0
- data/lib/action_controller/metal/redirecting.rb +251 -0
- data/lib/action_controller/metal/renderers.rb +181 -0
- data/lib/action_controller/metal/rendering.rb +260 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +667 -0
- data/lib/action_controller/metal/rescue.rb +33 -0
- data/lib/action_controller/metal/streaming.rb +183 -0
- data/lib/action_controller/metal/strong_parameters.rb +1546 -0
- data/lib/action_controller/metal/testing.rb +25 -0
- data/lib/action_controller/metal/url_for.rb +65 -0
- data/lib/action_controller/metal.rb +339 -0
- data/lib/action_controller/railtie.rb +149 -0
- data/lib/action_controller/railties/helpers.rb +26 -0
- data/lib/action_controller/renderer.rb +161 -0
- data/lib/action_controller/template_assertions.rb +13 -0
- data/lib/action_controller/test_case.rb +691 -0
- data/lib/action_controller.rb +80 -0
- data/lib/action_dispatch/constants.rb +34 -0
- data/lib/action_dispatch/deprecator.rb +9 -0
- data/lib/action_dispatch/http/cache.rb +249 -0
- data/lib/action_dispatch/http/content_disposition.rb +47 -0
- data/lib/action_dispatch/http/content_security_policy.rb +365 -0
- data/lib/action_dispatch/http/filter_parameters.rb +80 -0
- data/lib/action_dispatch/http/filter_redirect.rb +50 -0
- data/lib/action_dispatch/http/headers.rb +134 -0
- data/lib/action_dispatch/http/mime_negotiation.rb +187 -0
- data/lib/action_dispatch/http/mime_type.rb +389 -0
- data/lib/action_dispatch/http/mime_types.rb +54 -0
- data/lib/action_dispatch/http/parameters.rb +119 -0
- data/lib/action_dispatch/http/permissions_policy.rb +189 -0
- data/lib/action_dispatch/http/rack_cache.rb +67 -0
- data/lib/action_dispatch/http/request.rb +498 -0
- data/lib/action_dispatch/http/response.rb +556 -0
- data/lib/action_dispatch/http/upload.rb +107 -0
- data/lib/action_dispatch/http/url.rb +344 -0
- data/lib/action_dispatch/journey/formatter.rb +226 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +149 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +50 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +217 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +27 -0
- data/lib/action_dispatch/journey/nodes/node.rb +208 -0
- data/lib/action_dispatch/journey/parser.rb +103 -0
- data/lib/action_dispatch/journey/path/pattern.rb +209 -0
- data/lib/action_dispatch/journey/route.rb +189 -0
- data/lib/action_dispatch/journey/router/utils.rb +105 -0
- data/lib/action_dispatch/journey/router.rb +151 -0
- data/lib/action_dispatch/journey/routes.rb +82 -0
- data/lib/action_dispatch/journey/scanner.rb +70 -0
- data/lib/action_dispatch/journey/visitors.rb +267 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +159 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +7 -0
- data/lib/action_dispatch/log_subscriber.rb +25 -0
- data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
- data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
- data/lib/action_dispatch/middleware/callbacks.rb +38 -0
- data/lib/action_dispatch/middleware/cookies.rb +719 -0
- data/lib/action_dispatch/middleware/debug_exceptions.rb +206 -0
- data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
- data/lib/action_dispatch/middleware/debug_view.rb +73 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +350 -0
- data/lib/action_dispatch/middleware/executor.rb +32 -0
- data/lib/action_dispatch/middleware/flash.rb +318 -0
- data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
- data/lib/action_dispatch/middleware/public_exceptions.rb +64 -0
- data/lib/action_dispatch/middleware/reloader.rb +16 -0
- data/lib/action_dispatch/middleware/remote_ip.rb +199 -0
- data/lib/action_dispatch/middleware/request_id.rb +50 -0
- data/lib/action_dispatch/middleware/server_timing.rb +78 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +112 -0
- data/lib/action_dispatch/middleware/session/cache_store.rb +66 -0
- data/lib/action_dispatch/middleware/session/cookie_store.rb +129 -0
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +34 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +88 -0
- data/lib/action_dispatch/middleware/ssl.rb +180 -0
- data/lib/action_dispatch/middleware/stack.rb +194 -0
- data/lib/action_dispatch/middleware/static.rb +192 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +17 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +62 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
- data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +35 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +284 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +19 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +232 -0
- data/lib/action_dispatch/railtie.rb +77 -0
- data/lib/action_dispatch/request/session.rb +283 -0
- data/lib/action_dispatch/request/utils.rb +109 -0
- data/lib/action_dispatch/routing/endpoint.rb +19 -0
- data/lib/action_dispatch/routing/inspector.rb +323 -0
- data/lib/action_dispatch/routing/mapper.rb +2372 -0
- data/lib/action_dispatch/routing/polymorphic_routes.rb +363 -0
- data/lib/action_dispatch/routing/redirection.rb +218 -0
- data/lib/action_dispatch/routing/route_set.rb +958 -0
- data/lib/action_dispatch/routing/routes_proxy.rb +66 -0
- data/lib/action_dispatch/routing/url_for.rb +244 -0
- data/lib/action_dispatch/routing.rb +262 -0
- data/lib/action_dispatch/system_test_case.rb +206 -0
- data/lib/action_dispatch/system_testing/browser.rb +75 -0
- data/lib/action_dispatch/system_testing/driver.rb +85 -0
- data/lib/action_dispatch/system_testing/server.rb +33 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
- data/lib/action_dispatch/testing/assertion_response.rb +48 -0
- data/lib/action_dispatch/testing/assertions/response.rb +114 -0
- data/lib/action_dispatch/testing/assertions/routing.rb +343 -0
- data/lib/action_dispatch/testing/assertions.rb +25 -0
- data/lib/action_dispatch/testing/integration.rb +694 -0
- data/lib/action_dispatch/testing/request_encoder.rb +60 -0
- data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
- data/lib/action_dispatch/testing/test_process.rb +57 -0
- data/lib/action_dispatch/testing/test_request.rb +73 -0
- data/lib/action_dispatch/testing/test_response.rb +58 -0
- data/lib/action_dispatch.rb +147 -0
- data/lib/action_pack/gem_version.rb +19 -0
- data/lib/action_pack/version.rb +12 -0
- data/lib/action_pack.rb +27 -0
- 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 "<h1>Hello, World!</h1>"
|
|
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
|