What's the mechanism in Rails to share information within the current request scope?
Those familiar with Asp.Net would know there is a HttpContext that is available to all the entities that are invoked during a request.
Anything similar in Rails?
With around_filter
and Thread.current[]
you can easily create a request context/scope. See the following example.
First add in your application_controller.rb
:
around_filter :request_context
def request_context
begin
RequestContext.begin_request
yield
ensure
RequestContext.end_request
end
end
now add the following class to lib/request_context.rb
class RequestContext
def self.instance
i = Thread.current[:request_context]
unless i
raise "No instance present. In script/rakefiles: use RequestContext.with_scope {}, " +
"in controller: ensure `around_filter :request_scope` is configured"
end
return i
end
# Allows the use of this scope from rake/scripts
# ContextScope.with_scope do |scope|
# # do something
# ...
# end
def self.with_scope
begin
begin_request
yield(instance)
ensure
end_request
end
end
def self.begin_request
raise "request_context already set" if Thread.current[:request_context]
Thread.current[:request_context] = RequestContext.new
end
def self.end_request
raise "request_context already nil" unless Thread.current[:request_context]
Thread.current[:request_context] = nil
end
# user part, add constructors/getters/setters here
def initialize
# you can setup stuff here, be aware that this
# is being called in _every_ request.
end
end
This is pretty straightforward. You can store data in the RequestContext.instance object, the object will get recreated after every request.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With