Agile Web Development with Rails, Edition 4
15.4 Task J4: Add a locale switcher.
15.2 Task J2: translating the store front
15.3 Task J3: Translating Checkout
<(?-mix:4 errores han impedido que este pedido se guarde)> expected but was
<1 error prohibited this line_item from being saved:
Order translation missing: es.activerecord.errors.models.line_item.attributes.order.required>.
<0> expected to be
>=
<1>.
Traceback:
/home/rubys/git/awdwr/edition4/checkdepot.rb:397:in `block in <class:DepotTest>'
Edit the new order page
edit app/views/orders/new.html.erb
<div class="depot_form">
<fieldset>
<legend><%= t('.legend') %></legend>
<%= render 'form' %>
</fieldset>
</div>
Edit the form used by the new order page
edit app/views/orders/_form.html.erb
<%= form_for(order) do |f| %>
<% if order.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(order.errors.count, "error") %>
prohibited this order from being saved:</h2>
<ul>
<% order.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name, t('.name') %><br>
<%= f.text_field :name, size: 40 %>
</div>
<div class="field">
<%= f.label :address, t('.address_html') %><br>
<%= f.text_area :address, rows: 3, cols: 40 %>
</div>
<div class="field">
<%= f.label :email, t('.email') %><br>
<%= f.email_field :email, size: 40 %>
</div>
<div class="field">
<%= f.label :pay_type, t('.pay_type') %><br>
<%= f.select :pay_type, Order::PAYMENT_TYPES,
prompt: t('.pay_prompt_html') %>
</div>
<div class="actions">
<%= f.submit t('.submit') %>
</div>
<% end %>
Define some translations for the new order.
edit config/locales/en.yml
en:
orders:
new:
legend: "Please Enter Your Details"
form:
name: "Name"
address_html: "Address"
email: "E-mail"
pay_type: "Pay with"
pay_prompt_html: "Select a payment method"
submit: "Place Order"
edit config/locales/es.yml
es:
orders:
new:
legend: "Por favor, introduzca sus datos"
form:
name: "Nombre"
address_html: "Dirección"
email: "E-mail"
pay_type: "Forma de pago"
pay_prompt_html: "Seleccione un método de pago"
submit: "Realizar Pedido"
Add to cart
get /es
Publicaciones de Pragmatic
Carrito de la Compra
1×
CoffeeScript
36,00 $US
Total
36,00 $US
Su Catálogo de Pragmatic
CoffeeScript
CoffeeScript is JavaScript done right. It provides all of JavaScript's
functionality wrapped in a cleaner, more succinct syntax. In the first
book on this exciting new language, CoffeeScript guru Trevor Burnham
shows you how to hold onto all the power and flexibility of JavaScript
while writing clearer, cleaner, and safer code.
36,00 $US
Programming Ruby 1.9 & 2.0
Ruby is the fastest growing and most exciting dynamic language
out there. If you need to get working programs delivered fast,
you should add Ruby to your toolbox.
49,95 $US
Rails Test Prescriptions
Rails Test Prescriptions is a comprehensive guide to testing
Rails applications, covering Test-Driven Development from both a
theoretical perspective (why to test) and from a practical perspective
(how to test effectively). It covers the core Rails testing tools and
procedures for Rails 2 and Rails 3, and introduces popular add-ons,
including Cucumber, Shoulda, Machinist, Mocha, and Rcov.
34,95 $US
post /es/line_items?product_id=2
Publicaciones de Pragmatic
Carrito de la Compra
1×
CoffeeScript
36,00 $US
Total
36,00 $US
Show mixed validation errors
get /es/orders/new
Showing /home/rubys/git/awdwr/edition4/work-220/depot/app/views/orders/_form.html.erb where line #1 raised:
undefined local variable or method `order' for #<#<Class:0x0000000527dd28>:0x0000000527b550>
Extracted source (around line #1 ):
1
2
3
4
5
6
<%= form_for(order) do |f| %>
<% if order.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(order.errors.count, "error") %>
prohibited this order from being saved:</h2>
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #343 ):
341
342
343
344
345
346
locals[as] = object
content = @template.render(view, locals) do |*name|
view._layout_for(*name, &block)
end
Extracted source (around line #313 ):
311
312
313
314
315
316
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #312 ):
310
311
312
313
314
315
end
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
Extracted source (around line #47 ):
45
46
47
48
49
50
# Direct access to partial rendering.
def render_partial(context, options, &block) #:nodoc:
PartialRenderer.new(@lookup_context).render(context, options, block)
end
end
end
Extracted source (around line #35 ):
33
34
35
36
37
38
end
else
view_renderer.render_partial(self, :partial => options, :locals => locals, &block)
end
end
Extracted source (around line #6 ):
4
5
6
7
8
<legend><%= t('.legend') %></legend>
<!-- END_HIGHLIGHT -->
<%= render 'form' %>
</fieldset>
</div>
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #54 ):
52
53
54
55
56
57
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #53 ):
51
52
53
54
55
56
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
Extracted source (around line #61 ):
59
60
61
62
63
64
def render_with_layout(path, locals) #:nodoc:
layout = path && find_layout(path, locals.keys)
content = yield(layout)
if layout
view = @view
Extracted source (around line #52 ):
50
51
52
53
54
55
view, locals = @view, locals || {}
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
Extracted source (around line #14 ):
12
13
14
15
16
17
@lookup_context.rendered_format ||= (template.formats.first || formats.first)
render_template(template, options[:layout], options[:locals])
end
private
Extracted source (around line #42 ):
40
41
42
43
44
45
# Direct access to template rendering.
def render_template(context, options) #:nodoc:
TemplateRenderer.new(@lookup_context).render(context, options)
end
# Direct access to partial rendering.
Extracted source (around line #23 ):
21
22
23
24
25
26
render_partial(context, options)
else
render_template(context, options)
end
end
Extracted source (around line #103 ):
101
102
103
104
105
106
lookup_context.variants = variant if variant
view_renderer.render(context, options)
end
# Assign the rendered format to lookup context.
Extracted source (around line #217 ):
215
216
217
218
219
220
Rack::Chunked::Body.new view_renderer.render_body(view_context, options)
else
super
end
end
end
Extracted source (around line #83 ):
81
82
83
84
85
86
def render_to_body(options = {})
_process_options(options)
_render_template(options)
end
def rendered_format
Extracted source (around line #43 ):
41
42
43
44
45
46
def render_to_body(options = {})
super || _render_in_priorities(options) || ' '
end
private
Extracted source (around line #37 ):
35
36
37
38
39
40
def render_to_body(options)
_render_to_body_with_renderer(options) || super
end
def _render_to_body_with_renderer(options)
Extracted source (around line #25 ):
23
24
25
26
27
28
def render(*args, &block)
options = _normalize_render(*args, &block)
self.response_body = render_to_body(options)
_process_format(rendered_format, options) if rendered_format
self.response_body
end
Extracted source (around line #27 ):
25
26
27
28
29
30
def render(*args) #:nodoc:
raise ::AbstractController::DoubleRenderError if self.response_body
super
end
# Overwrite render_to_string because body can now be set to a rack body.
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #303 ):
301
302
303
304
305
306
def realtime # :yield:
r0 = Process.clock_gettime(BENCHMARK_CLOCK)
yield
Process.clock_gettime(BENCHMARK_CLOCK) - r0
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #87 ):
85
86
87
88
89
90
# :api: plugin
def cleanup_view_runtime #:nodoc:
yield
end
# Every time after an action is processed, this method is invoked
Extracted source (around line #25 ):
23
24
25
26
27
28
db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime = (db_runtime || 0) + db_rt_before_render
runtime = super
db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime += db_rt_after_render
runtime - db_rt_after_render
Extracted source (around line #43 ):
41
42
43
44
45
46
def render(*args)
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
Extracted source (around line #10 ):
8
9
10
11
12
13
def default_render(*args)
render(*args)
end
def method_for_action(action_name)
Extracted source (around line #5 ):
3
4
5
6
7
8
def send_action(method, *args)
ret = super
default_render unless performed?
ret
end
Extracted source (around line #189 ):
187
188
189
190
191
192
# which is *not* necessarily the same as the action name.
def process_action(method_name, *args)
send_action(method_name, *args)
end
# Actually call the method associated with the action. Override
Extracted source (around line #21 ):
19
20
21
22
23
24
def process_action(*) #:nodoc:
self.formats = request.formats.map(&:ref).compact
super
end
# Check for double render errors and set the content_type after rendering.
Extracted source (around line #20 ):
18
19
20
21
22
23
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #560 ):
558
559
560
561
562
563
def compile
@callbacks || @mutex.synchronize do
final_sequence = CallbackSequence.new { |env| Filters::ENDING.call(env) }
@callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
callback.apply callback_sequence
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #94 ):
92
93
94
95
96
97
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
runner.call(e).value
end
end
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #19 ):
17
18
19
20
21
22
# process_action callbacks around the normal behavior.
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #29 ):
27
28
29
30
31
32
private
def process_action(*args)
super
rescue Exception => exception
request.env['action_dispatch.show_detailed_exceptions'] ||= show_detailed_exceptions?
rescue_with_handler(exception) || raise(exception)
Extracted source (around line #32 ):
30
31
32
33
34
35
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
result
ensure
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #30 ):
28
29
30
31
32
33
ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
Extracted source (around line #249 ):
247
248
249
250
251
252
request.filtered_parameters.merge! wrapped_filtered_hash
end
super
end
private
Extracted source (around line #18 ):
16
17
18
19
20
21
# and it won't be cleaned up by the method below.
ActiveRecord::LogSubscriber.reset_runtime
super
end
def cleanup_view_runtime
Extracted source (around line #128 ):
126
127
128
129
130
131
@_response_body = nil
process_action(action_name, *args)
end
# Delegates to the class' ::controller_path
Extracted source (around line #30 ):
28
29
30
31
32
33
def process(*) #:nodoc:
old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)
super
ensure
I18n.config = old_config
end
Extracted source (around line #194 ):
192
193
194
195
196
197
def dispatch(name, request) #:nodoc:
set_request!(request)
process(name)
to_a
end
Extracted source (around line #241 ):
239
240
241
242
243
244
end
else
lambda { |env| new.dispatch(name, klass.new(env)) }
end
end
end
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #42 ):
40
41
42
43
44
45
end
dispatch(controller, params[:action], req.env)
end
def prepare_params!(params)
Extracted source (around line #43 ):
41
42
43
44
45
46
req.path_parameters = set_params.merge parameters
status, headers, body = route.app.serve(req)
if 'pass' == headers['X-Cascade']
req.script_name = script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #769 ):
767
768
769
770
771
772
req = request_class.new(env)
req.path_info = Journey::Router::Utils.normalize_path(req.path_info)
@router.serve(req)
end
def recognize_path(path, environment = {})
Extracted source (around line #24 ):
22
23
24
25
26
27
def call(env)
status, headers, body = @app.call(env)
if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
original_body = body
Extracted source (around line #25 ):
23
24
25
26
27
28
case env[REQUEST_METHOD]
when "GET", "HEAD"
status, headers, body = @app.call(env)
headers = Utils::HeaderHash.new(headers)
if status == 200 && fresh?(env, headers)
status = 304
Extracted source (around line #13 ):
11
12
13
14
15
16
def call(env)
status, headers, body = @app.call(env)
if env[REQUEST_METHOD] == HEAD
[
Extracted source (around line #27 ):
25
26
27
28
29
30
end
@app.call(env)
end
private
Extracted source (around line #266 ):
264
265
266
267
268
269
def call(env)
@app.call(env)
ensure
session = Request::Session.find(env) || {}
flash_hash = env[KEY]
Extracted source (around line #225 ):
223
224
225
226
227
228
def context(env, app=@app)
prepare_session(env)
status, headers, body = app.call(env)
commit_session(env, status, headers, body)
end
Extracted source (around line #220 ):
218
219
220
221
222
223
def call(env)
context(env)
end
def context(env, app=@app)
Extracted source (around line #560 ):
558
559
560
561
562
563
def call(env)
status, headers, body = @app.call(env)
if cookie_jar = env['action_dispatch.cookies']
unless cookie_jar.committed?
Extracted source (around line #36 ):
34
35
36
37
38
39
connection.enable_query_cache!
response = @app.call(env)
response[2] = Rack::BodyProxy.new(response[2]) do
restore_query_cache_settings(connection_id, enabled)
end
Extracted source (around line #642 ):
640
641
642
643
644
645
testing = env['rack.test']
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
ActiveRecord::Base.clear_active_connections! unless testing
end
Extracted source (around line #378 ):
376
377
378
379
380
381
end
end
@app.call(env)
end
private
Extracted source (around line #29 ):
27
28
29
30
31
32
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
end
end
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #27 ):
25
26
27
28
29
30
def call(env)
error = nil
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
Extracted source (around line #73 ):
71
72
73
74
75
76
prepare!
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) { cleanup! }
response
Extracted source (around line #78 ):
76
77
78
79
80
81
def call(env)
env["action_dispatch.remote_ip"] = GetIp.new(env, self)
@app.call(env)
end
# The GetIp class exists as a way to defer processing of the request data
Extracted source (around line #47 ):
45
46
47
48
49
50
def call(env)
_, headers, body = response = @app.call(env)
if headers['X-Cascade'] == 'pass'
body.close if body.respond_to?(:close)
Extracted source (around line #37 ):
35
36
37
38
39
40
end
status, headers, body = @app.call(env)
if exception = env['web_console.exception']
session = Session.from_exception(exception)
Extracted source (around line #30 ):
28
29
30
31
32
33
def call(env)
@app.call(env)
rescue Exception => exception
if env['action_dispatch.show_exceptions'] == false
raise exception
Extracted source (around line #38 ):
36
37
38
39
40
41
instrumenter.start 'request.action_dispatch', request: request
logger.info { started_request_message(request) }
resp = @app.call(env)
resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
resp
rescue Exception
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #26 ):
24
25
26
27
28
29
def tagged(*tags)
new_tags = push_tags(*tags)
yield self
ensure
pop_tags(new_tags.size)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #25 ):
23
24
25
26
27
28
def call(env)
env[ACTION_DISPATCH_REQUEST_ID] = external_request_id(env) || internal_request_id
@app.call(env).tap { |_status, headers, _body| headers[X_REQUEST_ID] = env[ACTION_DISPATCH_REQUEST_ID] }
end
private
Extracted source (around line #22 ):
20
21
22
23
24
25
end
@app.call(env)
end
def method_override(env)
Extracted source (around line #18 ):
16
17
18
19
20
21
def call(env)
start_time = Time.now
status, headers, body = @app.call(env)
request_time = Time.now - start_time
if !headers.has_key?(@header_name)
Extracted source (around line #28 ):
26
27
28
29
30
31
def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #115 ):
113
114
115
116
117
118
end
@app.call(env)
end
end
end
Extracted source (around line #113 ):
111
112
113
114
115
116
def call(env)
status, headers, body = @app.call(env)
if body.respond_to?(:to_path)
case type = variation(env)
when 'X-Accel-Redirect'
Extracted source (around line #518 ):
516
517
518
519
520
521
env[routes.env_key] = env['SCRIPT_NAME'].dup
end
app.call(env)
end
# Defines additional Rack env configuration that is added on each call.
Extracted source (around line #165 ):
163
164
165
166
167
168
env["ORIGINAL_FULLPATH"] = req.fullpath
env["ORIGINAL_SCRIPT_NAME"] = req.script_name
super(env)
end
# Reload application routes regardless if they changed or not.
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #15 ):
13
14
15
16
17
18
def call(env)
status, headers, body = @app.call(env)
headers = HeaderHash.new(headers)
if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
Extracted source (around line #89 ):
87
88
89
90
91
92
env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env[PATH_INFO]].join
status, headers, body = @app.call(env)
begin
res.status = status.to_i
headers.each { |k, vs|
Extracted source (around line #138 ):
136
137
138
139
140
141
si = servlet.get_instance(self, *options)
@logger.debug(format("%s is invoked.", si.class.name))
si.service(req, res)
end
##
Extracted source (around line #94 ):
92
93
94
95
96
97
callback.call(req, res)
end
server.service(req, res)
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
res.set_error(ex)
rescue HTTPStatus::Error => ex
Extracted source (around line #297 ):
295
296
297
298
299
300
end
call_callback(:AcceptCallback, sock)
block ? block.call(sock) : run(sock)
rescue Errno::ENOTCONN
@logger.debug "Errno::ENOTCONN raised"
rescue ServerError => ex
Trace of template inclusion: app/views/orders/new.html.erb
Rails.root: /home/rubys/git/awdwr/edition4/work-220/depot
Request
Parameters :
{"locale"=>"es"}
_csrf_token: "YqRzjzaaBuCfr/mg1Zv8lJTMmeNCaXdh7sHwaZ5l9VY="
cart_id: 4
session_id: "a581e31c60d5803defd0c93f5071c210"
user_id: 1
GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html"
HTTP_ACCEPT_ENCODING: "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "127.0.0.1"
SERVER_NAME: "localhost"
SERVER_PROTOCOL: "HTTP/1.1"
Response
Headers :
None
Translate the errors to human names.
edit config/locales/es.yml
es:
activerecord:
errors:
messages:
inclusion: "no está incluido en la lista"
blank: "no puede quedar en blanco"
errors:
template:
body: "Hay problemas con los siguientes campos:"
header:
one: "1 error ha impedido que este %{model} se guarde"
other: "%{count} errores han impedido que este %{model} se guarde"
Display messages in raw form, and translate error messages
edit app/views/orders/_form.html.erb
<%= form_for(order) do |f| %>
<% if order.errors.any? %>
<div id="error_explanation">
<h2><%=raw t('errors.template.header', count: @order.errors.count,
model: t('activerecord.models.order')) %>.</h2>
<p><%= t('errors.template.body') %></p>
<ul>
<% order.errors.full_messages.each do |message| %>
<li><%=raw message %></li>
<% end %>
</ul>
</div>
<% end %>
<!-- ... -->
<div class="field">
<%= f.label :name, t('.name') %><br>
<%= f.text_field :name, size: 40 %>
</div>
<div class="field">
<%= f.label :address, t('.address_html') %><br>
<%= f.text_area :address, rows: 3, cols: 40 %>
</div>
<div class="field">
<%= f.label :email, t('.email') %><br>
<%= f.email_field :email, size: 40 %>
</div>
<div class="field">
<%= f.label :pay_type, t('.pay_type') %><br>
<%= f.select :pay_type, Order::PAYMENT_TYPES,
prompt: t('.pay_prompt_html') %>
</div>
<div class="actions">
<%= f.submit t('.submit') %>
</div>
<% end %>
Translate the model names to human names.
edit config/locales/es.yml
es:
activerecord:
models:
order: "pedido"
attributes:
order:
address: "Dirección"
name: "Nombre"
email: "E-mail"
pay_type: "Forma de pago"
Show validation errors
get /es/orders/new
Showing /home/rubys/git/awdwr/edition4/work-220/depot/app/views/orders/_form.html.erb where line #2 raised:
undefined local variable or method `order' for #<#<Class:0x000000050a6608>:0x000000050a4e48>
Extracted source (around line #2 ):
1
2
3
4
5
6
<!-- START:explanation -->
<%= form_for(order) do |f| %>
<% if order.errors.any? %>
<div id="error_explanation">
<!-- START_HIGHLIGHT -->
<h2><%=raw t('errors.template.header', count: @order.errors.count,
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #343 ):
341
342
343
344
345
346
locals[as] = object
content = @template.render(view, locals) do |*name|
view._layout_for(*name, &block)
end
Extracted source (around line #313 ):
311
312
313
314
315
316
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #312 ):
310
311
312
313
314
315
end
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
Extracted source (around line #47 ):
45
46
47
48
49
50
# Direct access to partial rendering.
def render_partial(context, options, &block) #:nodoc:
PartialRenderer.new(@lookup_context).render(context, options, block)
end
end
end
Extracted source (around line #35 ):
33
34
35
36
37
38
end
else
view_renderer.render_partial(self, :partial => options, :locals => locals, &block)
end
end
Extracted source (around line #6 ):
4
5
6
7
8
<legend><%= t('.legend') %></legend>
<!-- END_HIGHLIGHT -->
<%= render 'form' %>
</fieldset>
</div>
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #54 ):
52
53
54
55
56
57
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #53 ):
51
52
53
54
55
56
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
Extracted source (around line #61 ):
59
60
61
62
63
64
def render_with_layout(path, locals) #:nodoc:
layout = path && find_layout(path, locals.keys)
content = yield(layout)
if layout
view = @view
Extracted source (around line #52 ):
50
51
52
53
54
55
view, locals = @view, locals || {}
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
Extracted source (around line #14 ):
12
13
14
15
16
17
@lookup_context.rendered_format ||= (template.formats.first || formats.first)
render_template(template, options[:layout], options[:locals])
end
private
Extracted source (around line #42 ):
40
41
42
43
44
45
# Direct access to template rendering.
def render_template(context, options) #:nodoc:
TemplateRenderer.new(@lookup_context).render(context, options)
end
# Direct access to partial rendering.
Extracted source (around line #23 ):
21
22
23
24
25
26
render_partial(context, options)
else
render_template(context, options)
end
end
Extracted source (around line #103 ):
101
102
103
104
105
106
lookup_context.variants = variant if variant
view_renderer.render(context, options)
end
# Assign the rendered format to lookup context.
Extracted source (around line #217 ):
215
216
217
218
219
220
Rack::Chunked::Body.new view_renderer.render_body(view_context, options)
else
super
end
end
end
Extracted source (around line #83 ):
81
82
83
84
85
86
def render_to_body(options = {})
_process_options(options)
_render_template(options)
end
def rendered_format
Extracted source (around line #43 ):
41
42
43
44
45
46
def render_to_body(options = {})
super || _render_in_priorities(options) || ' '
end
private
Extracted source (around line #37 ):
35
36
37
38
39
40
def render_to_body(options)
_render_to_body_with_renderer(options) || super
end
def _render_to_body_with_renderer(options)
Extracted source (around line #25 ):
23
24
25
26
27
28
def render(*args, &block)
options = _normalize_render(*args, &block)
self.response_body = render_to_body(options)
_process_format(rendered_format, options) if rendered_format
self.response_body
end
Extracted source (around line #27 ):
25
26
27
28
29
30
def render(*args) #:nodoc:
raise ::AbstractController::DoubleRenderError if self.response_body
super
end
# Overwrite render_to_string because body can now be set to a rack body.
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #303 ):
301
302
303
304
305
306
def realtime # :yield:
r0 = Process.clock_gettime(BENCHMARK_CLOCK)
yield
Process.clock_gettime(BENCHMARK_CLOCK) - r0
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #87 ):
85
86
87
88
89
90
# :api: plugin
def cleanup_view_runtime #:nodoc:
yield
end
# Every time after an action is processed, this method is invoked
Extracted source (around line #25 ):
23
24
25
26
27
28
db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime = (db_runtime || 0) + db_rt_before_render
runtime = super
db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime += db_rt_after_render
runtime - db_rt_after_render
Extracted source (around line #43 ):
41
42
43
44
45
46
def render(*args)
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
Extracted source (around line #10 ):
8
9
10
11
12
13
def default_render(*args)
render(*args)
end
def method_for_action(action_name)
Extracted source (around line #5 ):
3
4
5
6
7
8
def send_action(method, *args)
ret = super
default_render unless performed?
ret
end
Extracted source (around line #189 ):
187
188
189
190
191
192
# which is *not* necessarily the same as the action name.
def process_action(method_name, *args)
send_action(method_name, *args)
end
# Actually call the method associated with the action. Override
Extracted source (around line #21 ):
19
20
21
22
23
24
def process_action(*) #:nodoc:
self.formats = request.formats.map(&:ref).compact
super
end
# Check for double render errors and set the content_type after rendering.
Extracted source (around line #20 ):
18
19
20
21
22
23
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #560 ):
558
559
560
561
562
563
def compile
@callbacks || @mutex.synchronize do
final_sequence = CallbackSequence.new { |env| Filters::ENDING.call(env) }
@callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
callback.apply callback_sequence
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #94 ):
92
93
94
95
96
97
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
runner.call(e).value
end
end
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #19 ):
17
18
19
20
21
22
# process_action callbacks around the normal behavior.
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #29 ):
27
28
29
30
31
32
private
def process_action(*args)
super
rescue Exception => exception
request.env['action_dispatch.show_detailed_exceptions'] ||= show_detailed_exceptions?
rescue_with_handler(exception) || raise(exception)
Extracted source (around line #32 ):
30
31
32
33
34
35
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
result
ensure
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #30 ):
28
29
30
31
32
33
ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
Extracted source (around line #249 ):
247
248
249
250
251
252
request.filtered_parameters.merge! wrapped_filtered_hash
end
super
end
private
Extracted source (around line #18 ):
16
17
18
19
20
21
# and it won't be cleaned up by the method below.
ActiveRecord::LogSubscriber.reset_runtime
super
end
def cleanup_view_runtime
Extracted source (around line #128 ):
126
127
128
129
130
131
@_response_body = nil
process_action(action_name, *args)
end
# Delegates to the class' ::controller_path
Extracted source (around line #30 ):
28
29
30
31
32
33
def process(*) #:nodoc:
old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)
super
ensure
I18n.config = old_config
end
Extracted source (around line #194 ):
192
193
194
195
196
197
def dispatch(name, request) #:nodoc:
set_request!(request)
process(name)
to_a
end
Extracted source (around line #241 ):
239
240
241
242
243
244
end
else
lambda { |env| new.dispatch(name, klass.new(env)) }
end
end
end
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #42 ):
40
41
42
43
44
45
end
dispatch(controller, params[:action], req.env)
end
def prepare_params!(params)
Extracted source (around line #43 ):
41
42
43
44
45
46
req.path_parameters = set_params.merge parameters
status, headers, body = route.app.serve(req)
if 'pass' == headers['X-Cascade']
req.script_name = script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #769 ):
767
768
769
770
771
772
req = request_class.new(env)
req.path_info = Journey::Router::Utils.normalize_path(req.path_info)
@router.serve(req)
end
def recognize_path(path, environment = {})
Extracted source (around line #24 ):
22
23
24
25
26
27
def call(env)
status, headers, body = @app.call(env)
if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
original_body = body
Extracted source (around line #25 ):
23
24
25
26
27
28
case env[REQUEST_METHOD]
when "GET", "HEAD"
status, headers, body = @app.call(env)
headers = Utils::HeaderHash.new(headers)
if status == 200 && fresh?(env, headers)
status = 304
Extracted source (around line #13 ):
11
12
13
14
15
16
def call(env)
status, headers, body = @app.call(env)
if env[REQUEST_METHOD] == HEAD
[
Extracted source (around line #27 ):
25
26
27
28
29
30
end
@app.call(env)
end
private
Extracted source (around line #266 ):
264
265
266
267
268
269
def call(env)
@app.call(env)
ensure
session = Request::Session.find(env) || {}
flash_hash = env[KEY]
Extracted source (around line #225 ):
223
224
225
226
227
228
def context(env, app=@app)
prepare_session(env)
status, headers, body = app.call(env)
commit_session(env, status, headers, body)
end
Extracted source (around line #220 ):
218
219
220
221
222
223
def call(env)
context(env)
end
def context(env, app=@app)
Extracted source (around line #560 ):
558
559
560
561
562
563
def call(env)
status, headers, body = @app.call(env)
if cookie_jar = env['action_dispatch.cookies']
unless cookie_jar.committed?
Extracted source (around line #36 ):
34
35
36
37
38
39
connection.enable_query_cache!
response = @app.call(env)
response[2] = Rack::BodyProxy.new(response[2]) do
restore_query_cache_settings(connection_id, enabled)
end
Extracted source (around line #642 ):
640
641
642
643
644
645
testing = env['rack.test']
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
ActiveRecord::Base.clear_active_connections! unless testing
end
Extracted source (around line #378 ):
376
377
378
379
380
381
end
end
@app.call(env)
end
private
Extracted source (around line #29 ):
27
28
29
30
31
32
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
end
end
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #27 ):
25
26
27
28
29
30
def call(env)
error = nil
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
Extracted source (around line #73 ):
71
72
73
74
75
76
prepare!
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) { cleanup! }
response
Extracted source (around line #78 ):
76
77
78
79
80
81
def call(env)
env["action_dispatch.remote_ip"] = GetIp.new(env, self)
@app.call(env)
end
# The GetIp class exists as a way to defer processing of the request data
Extracted source (around line #47 ):
45
46
47
48
49
50
def call(env)
_, headers, body = response = @app.call(env)
if headers['X-Cascade'] == 'pass'
body.close if body.respond_to?(:close)
Extracted source (around line #37 ):
35
36
37
38
39
40
end
status, headers, body = @app.call(env)
if exception = env['web_console.exception']
session = Session.from_exception(exception)
Extracted source (around line #30 ):
28
29
30
31
32
33
def call(env)
@app.call(env)
rescue Exception => exception
if env['action_dispatch.show_exceptions'] == false
raise exception
Extracted source (around line #38 ):
36
37
38
39
40
41
instrumenter.start 'request.action_dispatch', request: request
logger.info { started_request_message(request) }
resp = @app.call(env)
resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
resp
rescue Exception
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #26 ):
24
25
26
27
28
29
def tagged(*tags)
new_tags = push_tags(*tags)
yield self
ensure
pop_tags(new_tags.size)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #25 ):
23
24
25
26
27
28
def call(env)
env[ACTION_DISPATCH_REQUEST_ID] = external_request_id(env) || internal_request_id
@app.call(env).tap { |_status, headers, _body| headers[X_REQUEST_ID] = env[ACTION_DISPATCH_REQUEST_ID] }
end
private
Extracted source (around line #22 ):
20
21
22
23
24
25
end
@app.call(env)
end
def method_override(env)
Extracted source (around line #18 ):
16
17
18
19
20
21
def call(env)
start_time = Time.now
status, headers, body = @app.call(env)
request_time = Time.now - start_time
if !headers.has_key?(@header_name)
Extracted source (around line #28 ):
26
27
28
29
30
31
def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #115 ):
113
114
115
116
117
118
end
@app.call(env)
end
end
end
Extracted source (around line #113 ):
111
112
113
114
115
116
def call(env)
status, headers, body = @app.call(env)
if body.respond_to?(:to_path)
case type = variation(env)
when 'X-Accel-Redirect'
Extracted source (around line #518 ):
516
517
518
519
520
521
env[routes.env_key] = env['SCRIPT_NAME'].dup
end
app.call(env)
end
# Defines additional Rack env configuration that is added on each call.
Extracted source (around line #165 ):
163
164
165
166
167
168
env["ORIGINAL_FULLPATH"] = req.fullpath
env["ORIGINAL_SCRIPT_NAME"] = req.script_name
super(env)
end
# Reload application routes regardless if they changed or not.
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #15 ):
13
14
15
16
17
18
def call(env)
status, headers, body = @app.call(env)
headers = HeaderHash.new(headers)
if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
Extracted source (around line #89 ):
87
88
89
90
91
92
env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env[PATH_INFO]].join
status, headers, body = @app.call(env)
begin
res.status = status.to_i
headers.each { |k, vs|
Extracted source (around line #138 ):
136
137
138
139
140
141
si = servlet.get_instance(self, *options)
@logger.debug(format("%s is invoked.", si.class.name))
si.service(req, res)
end
##
Extracted source (around line #94 ):
92
93
94
95
96
97
callback.call(req, res)
end
server.service(req, res)
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
res.set_error(ex)
rescue HTTPStatus::Error => ex
Extracted source (around line #297 ):
295
296
297
298
299
300
end
call_callback(:AcceptCallback, sock)
block ? block.call(sock) : run(sock)
rescue Errno::ENOTCONN
@logger.debug "Errno::ENOTCONN raised"
rescue ServerError => ex
Trace of template inclusion: app/views/orders/new.html.erb
Rails.root: /home/rubys/git/awdwr/edition4/work-220/depot
Request
Parameters :
{"locale"=>"es"}
_csrf_token: "YqRzjzaaBuCfr/mg1Zv8lJTMmeNCaXdh7sHwaZ5l9VY="
cart_id: 4
session_id: "a581e31c60d5803defd0c93f5071c210"
user_id: 1
GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html"
HTTP_ACCEPT_ENCODING: "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "127.0.0.1"
SERVER_NAME: "localhost"
SERVER_PROTOCOL: "HTTP/1.1"
Response
Headers :
None
Replace translatable text with calls out to translation functions.
edit app/controllers/orders_controller.rb
def create
@order = Order.new(order_params)
@order.add_line_items_from_cart(@cart)
respond_to do |format|
if @order.save
Cart.destroy(session[:cart_id])
session[:cart_id] = nil
session[:order_id] = @order.id
OrderNotifier.received(@order).deliver_later
format.html { redirect_to store_url, notice:
I18n.t('.thanks') }
format.json { render :show, status: :created,
location: @order }
else
format.html { render :new }
format.json { render json: @order.errors,
status: :unprocessable_entity }
end
end
end
Define some translations for the flash.
edit config/locales/en.yml
en:
thanks: "Thank you for your order"
edit config/locales/es.yml
es:
thanks: "Gracias por su pedido"
Place the order
get /es/orders/new
Showing /home/rubys/git/awdwr/edition4/work-220/depot/app/views/orders/_form.html.erb where line #2 raised:
undefined local variable or method `order' for #<#<Class:0x007f3fb94ef160>:0x007f3fb94ee1e8>
Extracted source (around line #2 ):
1
2
3
4
5
6
<!-- START:explanation -->
<%= form_for(order) do |f| %>
<% if order.errors.any? %>
<div id="error_explanation">
<!-- START_HIGHLIGHT -->
<h2><%=raw t('errors.template.header', count: @order.errors.count,
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #343 ):
341
342
343
344
345
346
locals[as] = object
content = @template.render(view, locals) do |*name|
view._layout_for(*name, &block)
end
Extracted source (around line #313 ):
311
312
313
314
315
316
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #312 ):
310
311
312
313
314
315
end
else
instrument(:partial, :identifier => identifier) do
render_partial
end
end
Extracted source (around line #47 ):
45
46
47
48
49
50
# Direct access to partial rendering.
def render_partial(context, options, &block) #:nodoc:
PartialRenderer.new(@lookup_context).render(context, options, block)
end
end
end
Extracted source (around line #35 ):
33
34
35
36
37
38
end
else
view_renderer.render_partial(self, :partial => options, :locals => locals, &block)
end
end
Extracted source (around line #6 ):
4
5
6
7
8
<legend><%= t('.legend') %></legend>
<!-- END_HIGHLIGHT -->
<%= render 'form' %>
</fieldset>
</div>
Extracted source (around line #159 ):
157
158
159
160
161
162
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
rescue => e
handle_render_error(view, e)
Extracted source (around line #166 ):
164
165
166
167
168
169
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
end
Extracted source (around line #351 ):
349
350
351
352
353
354
def instrument(action, &block)
payload = { virtual_path: @virtual_path, identifier: @identifier }
ActiveSupport::Notifications.instrument("#{action}.action_view", payload, &block)
end
def extract_resource_cache_call_name
Extracted source (around line #157 ):
155
156
157
158
159
160
# consume this in production. This is only slow if it's being listened to.
def render(view, locals, buffer=nil, &block)
instrument("!render_template") do
compile!(view)
view.send(method_name, locals, buffer, &block)
end
Extracted source (around line #54 ):
52
53
54
55
56
57
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #39 ):
37
38
39
40
41
42
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
def prepend_formats(formats)
Extracted source (around line #53 ):
51
52
53
54
55
56
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
end
Extracted source (around line #61 ):
59
60
61
62
63
64
def render_with_layout(path, locals) #:nodoc:
layout = path && find_layout(path, locals.keys)
content = yield(layout)
if layout
view = @view
Extracted source (around line #52 ):
50
51
52
53
54
55
view, locals = @view, locals || {}
render_with_layout(layout_name, locals) do |layout|
instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
template.render(view, locals) { |*name| view._layout_for(*name) }
end
Extracted source (around line #14 ):
12
13
14
15
16
17
@lookup_context.rendered_format ||= (template.formats.first || formats.first)
render_template(template, options[:layout], options[:locals])
end
private
Extracted source (around line #42 ):
40
41
42
43
44
45
# Direct access to template rendering.
def render_template(context, options) #:nodoc:
TemplateRenderer.new(@lookup_context).render(context, options)
end
# Direct access to partial rendering.
Extracted source (around line #23 ):
21
22
23
24
25
26
render_partial(context, options)
else
render_template(context, options)
end
end
Extracted source (around line #103 ):
101
102
103
104
105
106
lookup_context.variants = variant if variant
view_renderer.render(context, options)
end
# Assign the rendered format to lookup context.
Extracted source (around line #217 ):
215
216
217
218
219
220
Rack::Chunked::Body.new view_renderer.render_body(view_context, options)
else
super
end
end
end
Extracted source (around line #83 ):
81
82
83
84
85
86
def render_to_body(options = {})
_process_options(options)
_render_template(options)
end
def rendered_format
Extracted source (around line #43 ):
41
42
43
44
45
46
def render_to_body(options = {})
super || _render_in_priorities(options) || ' '
end
private
Extracted source (around line #37 ):
35
36
37
38
39
40
def render_to_body(options)
_render_to_body_with_renderer(options) || super
end
def _render_to_body_with_renderer(options)
Extracted source (around line #25 ):
23
24
25
26
27
28
def render(*args, &block)
options = _normalize_render(*args, &block)
self.response_body = render_to_body(options)
_process_format(rendered_format, options) if rendered_format
self.response_body
end
Extracted source (around line #27 ):
25
26
27
28
29
30
def render(*args) #:nodoc:
raise ::AbstractController::DoubleRenderError if self.response_body
super
end
# Overwrite render_to_string because body can now be set to a rack body.
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #303 ):
301
302
303
304
305
306
def realtime # :yield:
r0 = Process.clock_gettime(BENCHMARK_CLOCK)
yield
Process.clock_gettime(BENCHMARK_CLOCK) - r0
end
Extracted source (around line #12 ):
10
11
12
13
14
# # => 0.074
def ms
1000 * realtime { yield }
end
end
Extracted source (around line #44 ):
42
43
44
45
46
47
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
end
Extracted source (around line #87 ):
85
86
87
88
89
90
# :api: plugin
def cleanup_view_runtime #:nodoc:
yield
end
# Every time after an action is processed, this method is invoked
Extracted source (around line #25 ):
23
24
25
26
27
28
db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime = (db_runtime || 0) + db_rt_before_render
runtime = super
db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime
self.db_runtime += db_rt_after_render
runtime - db_rt_after_render
Extracted source (around line #43 ):
41
42
43
44
45
46
def render(*args)
render_output = nil
self.view_runtime = cleanup_view_runtime do
Benchmark.ms { render_output = super }
end
render_output
Extracted source (around line #10 ):
8
9
10
11
12
13
def default_render(*args)
render(*args)
end
def method_for_action(action_name)
Extracted source (around line #5 ):
3
4
5
6
7
8
def send_action(method, *args)
ret = super
default_render unless performed?
ret
end
Extracted source (around line #189 ):
187
188
189
190
191
192
# which is *not* necessarily the same as the action name.
def process_action(method_name, *args)
send_action(method_name, *args)
end
# Actually call the method associated with the action. Override
Extracted source (around line #21 ):
19
20
21
22
23
24
def process_action(*) #:nodoc:
self.formats = request.formats.map(&:ref).compact
super
end
# Check for double render errors and set the content_type after rendering.
Extracted source (around line #20 ):
18
19
20
21
22
23
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #119 ):
117
118
119
120
121
122
def call(env)
block = env.run_block
env.value = !env.halted && (!block || block.call)
env
end
end
Extracted source (around line #560 ):
558
559
560
561
562
563
def compile
@callbacks || @mutex.synchronize do
final_sequence = CallbackSequence.new { |env| Filters::ENDING.call(env) }
@callbacks ||= @chain.reverse.inject(final_sequence) do |callback_sequence, callback|
callback.apply callback_sequence
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #503 ):
501
502
503
504
505
506
def call(arg)
@before.each { |b| b.call(arg) }
value = @call.call(arg)
@after.each { |a| a.call(arg) }
value
end
Extracted source (around line #94 ):
92
93
94
95
96
97
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
runner.call(e).value
end
end
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #19 ):
17
18
19
20
21
22
# process_action callbacks around the normal behavior.
def process_action(*args)
run_callbacks(:process_action) do
super
end
end
Extracted source (around line #29 ):
27
28
29
30
31
32
private
def process_action(*args)
super
rescue Exception => exception
request.env['action_dispatch.show_detailed_exceptions'] ||= show_detailed_exceptions?
rescue_with_handler(exception) || raise(exception)
Extracted source (around line #32 ):
30
31
32
33
34
35
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
result
ensure
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #20 ):
18
19
20
21
22
23
start name, payload
begin
yield payload
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e
Extracted source (around line #164 ):
162
163
164
165
166
167
def instrument(name, payload = {})
if notifier.listening?(name)
instrumenter.instrument(name, payload) { yield payload if block_given? }
else
yield payload if block_given?
end
Extracted source (around line #30 ):
28
29
30
31
32
33
ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)
ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
begin
result = super
payload[:status] = response.status
Extracted source (around line #249 ):
247
248
249
250
251
252
request.filtered_parameters.merge! wrapped_filtered_hash
end
super
end
private
Extracted source (around line #18 ):
16
17
18
19
20
21
# and it won't be cleaned up by the method below.
ActiveRecord::LogSubscriber.reset_runtime
super
end
def cleanup_view_runtime
Extracted source (around line #128 ):
126
127
128
129
130
131
@_response_body = nil
process_action(action_name, *args)
end
# Delegates to the class' ::controller_path
Extracted source (around line #30 ):
28
29
30
31
32
33
def process(*) #:nodoc:
old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)
super
ensure
I18n.config = old_config
end
Extracted source (around line #194 ):
192
193
194
195
196
197
def dispatch(name, request) #:nodoc:
set_request!(request)
process(name)
to_a
end
Extracted source (around line #241 ):
239
240
241
242
243
244
end
else
lambda { |env| new.dispatch(name, klass.new(env)) }
end
end
end
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #73 ):
71
72
73
74
75
76
def dispatch(controller, action, env)
controller.action(action).call(env)
end
def normalize_controller!(params)
Extracted source (around line #42 ):
40
41
42
43
44
45
end
dispatch(controller, params[:action], req.env)
end
def prepare_params!(params)
Extracted source (around line #43 ):
41
42
43
44
45
46
req.path_parameters = set_params.merge parameters
status, headers, body = route.app.serve(req)
if 'pass' == headers['X-Cascade']
req.script_name = script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #30 ):
28
29
30
31
32
33
def serve(req)
find_routes(req).each do |match, parameters, route|
set_params = req.path_parameters
path_info = req.path_info
script_name = req.script_name
Extracted source (around line #769 ):
767
768
769
770
771
772
req = request_class.new(env)
req.path_info = Journey::Router::Utils.normalize_path(req.path_info)
@router.serve(req)
end
def recognize_path(path, environment = {})
Extracted source (around line #24 ):
22
23
24
25
26
27
def call(env)
status, headers, body = @app.call(env)
if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
original_body = body
Extracted source (around line #25 ):
23
24
25
26
27
28
case env[REQUEST_METHOD]
when "GET", "HEAD"
status, headers, body = @app.call(env)
headers = Utils::HeaderHash.new(headers)
if status == 200 && fresh?(env, headers)
status = 304
Extracted source (around line #13 ):
11
12
13
14
15
16
def call(env)
status, headers, body = @app.call(env)
if env[REQUEST_METHOD] == HEAD
[
Extracted source (around line #27 ):
25
26
27
28
29
30
end
@app.call(env)
end
private
Extracted source (around line #266 ):
264
265
266
267
268
269
def call(env)
@app.call(env)
ensure
session = Request::Session.find(env) || {}
flash_hash = env[KEY]
Extracted source (around line #225 ):
223
224
225
226
227
228
def context(env, app=@app)
prepare_session(env)
status, headers, body = app.call(env)
commit_session(env, status, headers, body)
end
Extracted source (around line #220 ):
218
219
220
221
222
223
def call(env)
context(env)
end
def context(env, app=@app)
Extracted source (around line #560 ):
558
559
560
561
562
563
def call(env)
status, headers, body = @app.call(env)
if cookie_jar = env['action_dispatch.cookies']
unless cookie_jar.committed?
Extracted source (around line #36 ):
34
35
36
37
38
39
connection.enable_query_cache!
response = @app.call(env)
response[2] = Rack::BodyProxy.new(response[2]) do
restore_query_cache_settings(connection_id, enabled)
end
Extracted source (around line #642 ):
640
641
642
643
644
645
testing = env['rack.test']
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
ActiveRecord::Base.clear_active_connections! unless testing
end
Extracted source (around line #378 ):
376
377
378
379
380
381
end
end
@app.call(env)
end
private
Extracted source (around line #29 ):
27
28
29
30
31
32
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
end
end
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #90 ):
88
89
90
91
92
93
def _run_callbacks(callbacks, &block)
if callbacks.empty?
block.call if block
else
runner = callbacks.compile
e = Filters::Environment.new(self, false, nil, block)
Extracted source (around line #804 ):
802
803
804
805
806
807
module_eval <<-RUBY, __FILE__, __LINE__ + 1
def _run_#{name}_callbacks(&block)
_run_callbacks(_#{name}_callbacks, &block)
end
RUBY
end
Extracted source (around line #83 ):
81
82
83
84
85
86
# end
def run_callbacks(kind, &block)
send "_run_#{kind}_callbacks", &block
end
private
Extracted source (around line #27 ):
25
26
27
28
29
30
def call(env)
error = nil
result = run_callbacks :call do
begin
@app.call(env)
rescue => error
Extracted source (around line #73 ):
71
72
73
74
75
76
prepare!
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) { cleanup! }
response
Extracted source (around line #78 ):
76
77
78
79
80
81
def call(env)
env["action_dispatch.remote_ip"] = GetIp.new(env, self)
@app.call(env)
end
# The GetIp class exists as a way to defer processing of the request data
Extracted source (around line #47 ):
45
46
47
48
49
50
def call(env)
_, headers, body = response = @app.call(env)
if headers['X-Cascade'] == 'pass'
body.close if body.respond_to?(:close)
Extracted source (around line #37 ):
35
36
37
38
39
40
end
status, headers, body = @app.call(env)
if exception = env['web_console.exception']
session = Session.from_exception(exception)
Extracted source (around line #30 ):
28
29
30
31
32
33
def call(env)
@app.call(env)
rescue Exception => exception
if env['action_dispatch.show_exceptions'] == false
raise exception
Extracted source (around line #38 ):
36
37
38
39
40
41
instrumenter.start 'request.action_dispatch', request: request
logger.info { started_request_message(request) }
resp = @app.call(env)
resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
resp
rescue Exception
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #26 ):
24
25
26
27
28
29
def tagged(*tags)
new_tags = push_tags(*tags)
yield self
ensure
pop_tags(new_tags.size)
end
Extracted source (around line #70 ):
68
69
70
71
72
73
def tagged(*tags)
formatter.tagged(*tags) { yield self }
end
def flush
Extracted source (around line #20 ):
18
19
20
21
22
23
if logger.respond_to?(:tagged)
logger.tagged(compute_tags(request)) { call_app(request, env) }
else
call_app(request, env)
end
Extracted source (around line #25 ):
23
24
25
26
27
28
def call(env)
env[ACTION_DISPATCH_REQUEST_ID] = external_request_id(env) || internal_request_id
@app.call(env).tap { |_status, headers, _body| headers[X_REQUEST_ID] = env[ACTION_DISPATCH_REQUEST_ID] }
end
private
Extracted source (around line #22 ):
20
21
22
23
24
25
end
@app.call(env)
end
def method_override(env)
Extracted source (around line #18 ):
16
17
18
19
20
21
def call(env)
start_time = Time.now
status, headers, body = @app.call(env)
request_time = Time.now - start_time
if !headers.has_key?(@header_name)
Extracted source (around line #28 ):
26
27
28
29
30
31
def call(env)
LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)
response = @app.call(env)
response[2] = ::Rack::BodyProxy.new(response[2]) do
LocalCacheRegistry.set_cache_for(local_cache_key, nil)
end
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #115 ):
113
114
115
116
117
118
end
@app.call(env)
end
end
end
Extracted source (around line #113 ):
111
112
113
114
115
116
def call(env)
status, headers, body = @app.call(env)
if body.respond_to?(:to_path)
case type = variation(env)
when 'X-Accel-Redirect'
Extracted source (around line #518 ):
516
517
518
519
520
521
env[routes.env_key] = env['SCRIPT_NAME'].dup
end
app.call(env)
end
# Defines additional Rack env configuration that is added on each call.
Extracted source (around line #165 ):
163
164
165
166
167
168
env["ORIGINAL_FULLPATH"] = req.fullpath
env["ORIGINAL_SCRIPT_NAME"] = req.script_name
super(env)
end
# Reload application routes regardless if they changed or not.
Extracted source (around line #17 ):
15
16
17
18
19
20
old, env[FLAG] = env[FLAG], false
@mutex.lock
response = @app.call(env)
body = BodyProxy.new(response[2]) { @mutex.unlock }
response[2] = body
response
Extracted source (around line #15 ):
13
14
15
16
17
18
def call(env)
status, headers, body = @app.call(env)
headers = HeaderHash.new(headers)
if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
Extracted source (around line #89 ):
87
88
89
90
91
92
env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env[PATH_INFO]].join
status, headers, body = @app.call(env)
begin
res.status = status.to_i
headers.each { |k, vs|
Extracted source (around line #138 ):
136
137
138
139
140
141
si = servlet.get_instance(self, *options)
@logger.debug(format("%s is invoked.", si.class.name))
si.service(req, res)
end
##
Extracted source (around line #94 ):
92
93
94
95
96
97
callback.call(req, res)
end
server.service(req, res)
rescue HTTPStatus::EOFError, HTTPStatus::RequestTimeout => ex
res.set_error(ex)
rescue HTTPStatus::Error => ex
Extracted source (around line #297 ):
295
296
297
298
299
300
end
call_callback(:AcceptCallback, sock)
block ? block.call(sock) : run(sock)
rescue Errno::ENOTCONN
@logger.debug "Errno::ENOTCONN raised"
rescue ServerError => ex
Trace of template inclusion: app/views/orders/new.html.erb
Rails.root: /home/rubys/git/awdwr/edition4/work-220/depot
Request
Parameters :
{"locale"=>"es"}
_csrf_token: "YqRzjzaaBuCfr/mg1Zv8lJTMmeNCaXdh7sHwaZ5l9VY="
cart_id: 4
session_id: "a581e31c60d5803defd0c93f5071c210"
user_id: 1
GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html"
HTTP_ACCEPT_ENCODING: "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "127.0.0.1"
SERVER_NAME: "localhost"
SERVER_PROTOCOL: "HTTP/1.1"
Response
Headers :
None
15.4 Task J4: Add a locale switcher.
15.2 Task J2: translating the store front