Contextuality allows you to make global variables for individual contexts.
It is threadsafe and can forward contexts inside Thread.new {}
blocks.
Context is just variables name-value hash.
You can access any context variable inside context.
It is better than global variables or singleton because variables could be set only higher in call stack and you know it. No more unexpected values.
Add this line to your application's Gemfile:
gem 'contextuality'
And then execute:
$ bundle
Or install it yourself as:
$ gem install contextuality
class Foo
include Contextuality
def self.foo
contextuality.foo
end
def foo
contextuality.foo
end
end
contextualize(foo: 'Hello') do
Foo.foo #=> "Hello"
end #=> "Hello"
contextualize(foo: 'Goodbye') do
Foo.new.foo #=> "Goodbye"
end #=> "Goodbye"
# If context variable is not set - it returns nil
contextualize(bar: 'Hello') do
Foo.new.foo #=> nil
end #=> nil
# Contexts can be stacked along the callstack
contextualize(foo: 'Hello') do
contextualize(bar: 'Goodbye') do
"#{Foo.new.foo} #{Foo.contextuality.bar}" #=> "Hello Goodbye"
end #=> "Hello Goodbye"
end #=> "Hello Goodbye"
# Also context variables can be redefined deeper
contextualize(foo: 'Hello') do
contextualize(foo: 'Goodbye') do
Foo.new.foo #=> "Goodbye"
end #=> "Goodbye"
Foo.new.foo #=> "Hello"
end #=> "Hello"
You can include Contextuality
in Object and get access to context everywhere,
or just include in classes on-demand.
contextualize(foo: 'Hello') do
Contextuality.foo #=> "Hello"
end #=> "Hello"
Contextuality.defaults[:foo] = 'Hello'
Contextuality.defaults[:bar] = ->{ 'Hello' }
contextualize(foo: 'Goodbye') do
Contextuality.bar #=> 'Hello'
Foo.foo #=> "Goodbye"
end #=> "Goodbye"
contextualize do
Foo.foo #=> "Hello"
end #=> "Hello"
# config/initializers/contextuality.rb
Contextuality.defaults[:host] = 'default'
# app/models/article.rb
class Article < ActiveRecord::Base
include Contextuality
def self.for_current_host
where(host: contextuality.host)
end
end
# app/controllers/article_controller.rb
class ArticlesController < ActionController::Base
around_filter :setup_host
def index
@articles = Article.for_current_host
end
private
def setup_host
contextualize(host: host_for(request.host)) do
yield
end
end
end
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request