 
      
      Tags
Templates are actually a very clean way to define a query method, but a template without tags generates a completely static method. For example the following template will always request the same query:
my_request:
- query:
    term:
      user_id: 25That may make sense in some context, but typically we would like to use the same template with a different user_id for example. So let’s replace the parts that we want to be dynamic with a simple named tags:
my_request:
- query:
    term:
     user_id: <<user_id>>Now we can interpolate the user_id tag by just passing its value as a variable, matching tag names with variable keys.
results1 = MyClass.my_request :user_id => 25
results2 = MyClass.my_request :user_id => 49Tags Syntax
Tags are used as placeholder for the real values that will be interpolated into the structure just before executing the http request. The syntax follows a few very simple rules:
- their name must be suitable to be ruby method names
- they must not be one of the reserved variable names (see Special Variables)
- you can use or omit spaces around names
- they may contextually define a default (similar to the arguments of a ruby method)
Here are a few examples of tags:
<<a_tag>>
<< another_tag >>
<<a_tag_with_default= the default >>
<< an_optional_tag= ~ >>
<< _a_partial_template >>
"<<a_quote_wrapped_tag= {query: '*'} >>" # (the wrapping quotes avoid a YAML parsing error due to the ':')
<< a_nested.tag.1 >> # (will be interpolated with :a_nested[:tag][1] variable value)
You are not limited to use tag as value placeholder: you can use them anywhere in the yaml, also as key placeholder or partial keys or values if it makes sense to you:
most_counted:
- sort:
    <<counter>>_count: descJust remember that they will be substituted by the values that a variable key of the same name will contain, so for example using the above template:
blog_sorted = MyClass.most_counted :counter => 'blog'
post_sorted = MyClass.most_counted :counter => 'post'will respectively generate {"sort":{"blog_count":"desc"}} {"sort":{"post_count":"desc"}} data queries.
(see Interpolation)
Tag defaults
Tags interpolation is very easy and straightforward, but tags can do more for you. For example, let’s say we want to use a default user_id when we don’t have any specific one. So let’s add a default:
my_request:
- query:
    term:
      user_id: <<user_id= 10 >>With this template/method if we don’t pass any :user_id variable, the default value will be used. So we can use the query method like:
results1 = MyClass.my_request # will use :user_id => 10
results2 = MyClass.my_request :user_id => 45Tags defaults work very similarly to the argument defaults of ruby methods. Notice however that the default string (from the = to the closing >>) is evaluated as a YAML string as well, so you may need to wrap the tag in quotes if you want to pass valid YAML as a default. Besides, if you want to define a nil value as a default, you should use the ~ character (that YAML explicitly evaluates to nil). Besides, nil as a default will also make the tag optional.
(see Variables)
