Class: Mustache::Context
- Inherits:
-
Object
- Object
- Mustache::Context
- Defined in:
- lib/mustache/context.rb
Overview
A Context represents the context which a Mustache template is executed within. All Mustache tags reference keys in the Context.
Instance Method Summary collapse
-
#[](name) ⇒ Object
Alias for ‘fetch`.
-
#[]=(name, value) ⇒ Object
Can be used to add a value to the context in a hash-like way.
-
#fetch(name, default = :__raise) ⇒ Object
Similar to Hash#fetch, finds a value by ‘name` in the context’s stack.
-
#has_key?(key) ⇒ Boolean
Do we know about a particular key? In other words, will calling ‘context` give us a result that was set.
-
#initialize(mustache) ⇒ Context
constructor
Expect to be passed an instance of ‘Mustache`.
-
#mustache_in_stack ⇒ Object
Find the first Mustache in the stack.
-
#partial(name) ⇒ Object
A {>partial} tag translates into a call to the context’s ‘partial` method, which would be this sucker right here.
-
#pop ⇒ Object
Removes the most recently added object from the context’s internal stack.
-
#push(new) ⇒ Object
(also: #update)
Adds a new object to the context’s internal stack.
Constructor Details
#initialize(mustache) ⇒ Context
Expect to be passed an instance of ‘Mustache`.
16 17 18 |
# File 'lib/mustache/context.rb', line 16 def initialize(mustache) @stack = [mustache] end |
Instance Method Details
#[](name) ⇒ Object
Alias for ‘fetch`.
66 67 68 |
# File 'lib/mustache/context.rb', line 66 def [](name) fetch(name, nil) end |
#[]=(name, value) ⇒ Object
Can be used to add a value to the context in a hash-like way.
context = “Chris”
61 62 63 |
# File 'lib/mustache/context.rb', line 61 def []=(name, value) push(name => value) end |
#fetch(name, default = :__raise) ⇒ Object
Similar to Hash#fetch, finds a value by ‘name` in the context’s stack. You may specify the default return value by passing a second parameter.
If no second parameter is passed (or raise_on_context_miss is set to true), will raise a ContextMiss exception on miss.
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/mustache/context.rb', line 84 def fetch(name, default = :__raise) @stack.each do |frame| # Prevent infinite recursion. next if frame == self # Is this frame a hash? hash = frame.respond_to?(:has_key?) if hash && frame.has_key?(name) return frame[name] elsif hash && frame.has_key?(name.to_s) return frame[name.to_s] elsif !hash && frame.respond_to?(name) return frame.__send__(name) end end if default == :__raise || mustache_in_stack.raise_on_context_miss? raise ContextMiss.new("Can't find #{name} in #{@stack.inspect}") else default end end |
#has_key?(key) ⇒ Boolean
Do we know about a particular key? In other words, will calling ‘context` give us a result that was set. Basically.
72 73 74 75 76 |
# File 'lib/mustache/context.rb', line 72 def has_key?(key) !!fetch(key) rescue ContextMiss false end |
#mustache_in_stack ⇒ Object
Find the first Mustache in the stack. If we’re being rendered inside a Mustache object as a context, we’ll use that one.
36 37 38 |
# File 'lib/mustache/context.rb', line 36 def mustache_in_stack @stack.detect { |frame| frame.is_a?(Mustache) } end |
#partial(name) ⇒ Object
A {>partial} tag translates into a call to the context’s ‘partial` method, which would be this sucker right here.
If the Mustache view handling the rendering (e.g. the view representing your profile page or some other template) responds to ‘partial`, we call it and render the result.
26 27 28 29 30 31 32 |
# File 'lib/mustache/context.rb', line 26 def partial(name) # Look for the first Mustache in the stack. mustache = mustache_in_stack # Call its `partial` method and render the result. mustache.render(mustache.partial(name), self) end |
#pop ⇒ Object
Removes the most recently added object from the context’s internal stack.
Returns the Context.
53 54 55 56 |
# File 'lib/mustache/context.rb', line 53 def pop @stack.shift self end |
#push(new) ⇒ Object Also known as: update
Adds a new object to the context’s internal stack.
Returns the Context.
43 44 45 46 |
# File 'lib/mustache/context.rb', line 43 def push(new) @stack.unshift(new) self end |