@@ -20,7 +20,7 @@ module ActionController
20
20
# PostsController.render :show, assigns: { post: Post.first }
21
21
#
22
22
class Renderer
23
- attr_reader :defaults , : controller
23
+ attr_reader :controller
24
24
25
25
DEFAULTS = {
26
26
http_host : "example.org" ,
@@ -30,23 +30,44 @@ class Renderer
30
30
input : ""
31
31
} . freeze
32
32
33
+ def self . normalize_env ( env ) # :nodoc:
34
+ new_env = { }
35
+
36
+ env . each_pair do |key , value |
37
+ case key
38
+ when :https
39
+ value = value ? "on" : "off"
40
+ when :method
41
+ value = -value . upcase
42
+ end
43
+
44
+ key = RACK_KEY_TRANSLATION [ key ] || key . to_s
45
+
46
+ new_env [ key ] = value
47
+ end
48
+
49
+ new_env [ "rack.url_scheme" ] = new_env [ "HTTPS" ] == "on" ? "https" : "http"
50
+
51
+ new_env
52
+ end
53
+
33
54
# Creates a new renderer using the given controller class. See ::new.
34
- def self . for ( controller , env = { } , defaults = DEFAULTS . dup )
55
+ def self . for ( controller , env = nil , defaults = DEFAULTS )
35
56
new ( controller , env , defaults )
36
57
end
37
58
38
59
# Creates a new renderer using the same controller, but with a new Rack env.
39
60
#
40
61
# ApplicationController.renderer.new(method: "post")
41
62
#
42
- def new ( env = { } )
43
- self . class . new controller , env , defaults
63
+ def new ( env = nil )
64
+ self . class . new controller , env , @ defaults
44
65
end
45
66
46
67
# Creates a new renderer using the same controller, but with the given
47
68
# defaults merged on top of the previous defaults.
48
69
def with_defaults ( defaults )
49
- self . class . new controller , @env , self . defaults . merge ( defaults )
70
+ self . class . new controller , @env , @ defaults. merge ( defaults )
50
71
end
51
72
52
73
# Initializes a new Renderer.
@@ -72,7 +93,17 @@ def with_defaults(defaults)
72
93
def initialize ( controller , env , defaults )
73
94
@controller = controller
74
95
@defaults = defaults
75
- @env = normalize_keys defaults , env
96
+ if env . blank? && @defaults == DEFAULTS
97
+ @env = DEFAULT_ENV
98
+ else
99
+ @env = normalize_env ( @defaults )
100
+ @env . merge! ( normalize_env ( env ) ) unless env . blank?
101
+ end
102
+ end
103
+
104
+ def defaults
105
+ @defaults = @defaults . dup if @defaults . frozen?
106
+ @defaults
76
107
end
77
108
78
109
# Render templates with any options from ActionController::Base#render_to_string.
@@ -99,7 +130,7 @@ def initialize(controller, env, defaults)
99
130
def render ( *args )
100
131
raise "missing controller" unless controller
101
132
102
- request = ActionDispatch ::Request . new @env
133
+ request = ActionDispatch ::Request . new ( @env . dup )
103
134
request . routes = controller . _routes
104
135
105
136
instance = controller . new
@@ -110,19 +141,6 @@ def render(*args)
110
141
alias_method :render_to_string , :render # :nodoc:
111
142
112
143
private
113
- def normalize_keys ( defaults , env )
114
- new_env = { }
115
- env . each_pair { |k , v | new_env [ rack_key_for ( k ) ] = rack_value_for ( k , v ) }
116
-
117
- defaults . each_pair do |k , v |
118
- key = rack_key_for ( k )
119
- new_env [ key ] = rack_value_for ( k , v ) unless new_env . key? ( key )
120
- end
121
-
122
- new_env [ "rack.url_scheme" ] = new_env [ "HTTPS" ] == "on" ? "https" : "http"
123
- new_env
124
- end
125
-
126
144
RACK_KEY_TRANSLATION = {
127
145
http_host : "HTTP_HOST" ,
128
146
https : "HTTPS" ,
@@ -131,19 +149,8 @@ def normalize_keys(defaults, env)
131
149
input : "rack.input"
132
150
}
133
151
134
- def rack_key_for ( key )
135
- RACK_KEY_TRANSLATION [ key ] || key . to_s
136
- end
152
+ DEFAULT_ENV = normalize_env ( DEFAULTS ) . freeze # :nodoc:
137
153
138
- def rack_value_for ( key , value )
139
- case key
140
- when :https
141
- value ? "on" : "off"
142
- when :method
143
- -value . upcase
144
- else
145
- value
146
- end
147
- end
154
+ delegate :normalize_env , to : :class
148
155
end
149
156
end
0 commit comments