Class: Radius::Context
- Inherits:
-
Object
- Object
- Radius::Context
- Defined in:
- lib/radius/context.rb
Overview
A context contains the tag definitions which are available for use in a template. See the QUICKSTART for a detailed explaination its usage.
Instance Attribute Summary collapse
-
#definitions ⇒ Object
A hash of tag definition blocks that define tags accessible on a Context.
-
#globals ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#current_nesting ⇒ Object
Returns the state of the current render stack.
-
#define_tag(name, options = {}, &block) ⇒ Object
Creates a tag definition on a context.
-
#dup ⇒ Object
make a usable copy of this context.
-
#initialize(&block) ⇒ Context
constructor
Creates a new Context object.
-
#render_tag(name, attributes = {}, &block) ⇒ Object
Returns the value of a rendered tag.
-
#tag_missing(name, attributes, &block) ⇒ Object
Like method_missing for objects, but fired when a tag is undefined.
-
#with {|_self| ... } ⇒ Object
Yield an instance of self for tag definitions:.
Constructor Details
#initialize(&block) ⇒ Context
Creates a new Context object.
13 14 15 16 17 18 |
# File 'lib/radius/context.rb', line 13 def initialize(&block) @definitions = {} @tag_binding_stack = [] @globals = DelegatingOpenStruct.new with(&block) if block_given? end |
Instance Attribute Details
#definitions ⇒ Object
A hash of tag definition blocks that define tags accessible on a Context.
9 10 11 |
# File 'lib/radius/context.rb', line 9 def definitions @definitions end |
#globals ⇒ Object
:nodoc:
10 11 12 |
# File 'lib/radius/context.rb', line 10 def globals @globals end |
Instance Method Details
#current_nesting ⇒ Object
Returns the state of the current render stack. Useful from inside a tag definition. Normally just use TagBinding#nesting.
79 80 81 |
# File 'lib/radius/context.rb', line 79 def current_nesting @tag_binding_stack.collect { |tag| tag.name }.join(':') end |
#define_tag(name, options = {}, &block) ⇒ Object
Creates a tag definition on a context. Several options are available to you when creating a tag:
forSpecifies an object that the tag is in reference to. This is applicable when a block is not passed to the tag, or when the
exposeoption is also used.exposeSpecifies that child tags should be set for each of the methods contained in this option. May be either a single symbol/string or an array of symbols/strings.
attributesSpecifies whether or not attributes should be exposed automatically. Useful for ActiveRecord objects. Boolean. Defaults to
true.
48 49 50 51 52 |
# File 'lib/radius/context.rb', line 48 def define_tag(name, = {}, &block) type = Utility.impartial_hash_delete(, :type).to_s klass = Utility.constantize('Radius::TagDefinitions::' + Utility.camelize(type) + 'TagFactory') rescue raise(ArgumentError.new("Undefined type `#{type}' in options hash")) klass.new(self).define_tag(name, , &block) end |
#dup ⇒ Object
make a usable copy of this context
84 85 86 87 88 89 |
# File 'lib/radius/context.rb', line 84 def dup # :nodoc: rv = self.class.new rv.globals = globals.dup rv.definitions = definitions.dup rv end |
#render_tag(name, attributes = {}, &block) ⇒ Object
Returns the value of a rendered tag. Used internally by Parser#parse.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/radius/context.rb', line 55 def render_tag(name, attributes = {}, &block) if name =~ /^(.+?):(.+)$/ render_tag($1) { render_tag($2, attributes, &block) } else tag_definition_block = @definitions[qualified_tag_name(name.to_s)] if tag_definition_block stack(name, attributes, block) do |tag| tag_definition_block.call(tag).to_s end else tag_missing(name, attributes, &block) end end end |
#tag_missing(name, attributes, &block) ⇒ Object
Like method_missing for objects, but fired when a tag is undefined. Override in your own Context to change what happens when a tag is undefined. By default this method raises an UndefinedTagError.
73 74 75 |
# File 'lib/radius/context.rb', line 73 def tag_missing(name, attributes, &block) raise UndefinedTagError.new(name) end |
#with {|_self| ... } ⇒ Object
Yield an instance of self for tag definitions:
context.with do |c|
c.define_tag 'test' do
'test'
end
end
28 29 30 31 |
# File 'lib/radius/context.rb', line 28 def with yield self self end |