# Logic less mode
Logic less mode is inspired by [Mustache](https://github.com/defunkt/mustache). Logic less mode uses a dictionary object
e.g. a recursive hash tree which contains the dynamic content.
## Conditional
If the object is not false or empty?, the content will show
- article
h1 = title
## Inverted conditional
If the object is false or empty?, the content will show
-! article
p Sorry, article not found
## Iteration
If the object is an array, the section will iterate
- articles
tr: td = title
## Lambdas
Like mustache, Slim supports lambdas.
= person
= name
The lambda method could be defined like this
def lambda_method
"
#{yield(name: 'Andrew')}
"
end
You can optionally pass one or more hashes to `yield`. If you pass multiple hashes, the block will be iterated as described above.
## Dictionary access
Example code:
- article
h1 = title
The dictionary object is accessed in the order given by the `:dictionary_access`. Default order:
1. `:symbol` - If `article.respond_to?(:has_key?)` and `article.has_key?(:title)`, Slim will execute `article[:title]`
2. `:string` - If `article.respond_to?(:has_key?)` and `article.has_key?('title')`, Slim will execute `article['title']`
3. `:method` - If `article.respond_to?(:title)`, Slim will execute `article.send(:title)`
4. `:instance_variable` - If `article.instance_variable_defined?(@title)`, Slim will execute `article.instance_variable_get @title`
If all the above fails, Slim will try to resolve the title reference in the same order against the parent object. In this example, the parent would be the dictionary object you are rendering the template against.
As you might have guessed, the article reference goes through the same steps against the dictionary. Instance variables are not allowed in the view code, but Slim will find and use them. Essentially, you're just dropping the @ prefix in your template. Parameterized method calls are not allowed.
## Strings
The `self` keyword will return the `.to_s` value for the element under consideration.
Given
{
article: [
'Article 1',
'Article 2'
]
}
And
- article
tr: td = self
This will yield
Article 1 |
>
Article 2 |
## Logic less in Rails
Install:
$ gem install slim
Require:
gem 'slim', require: 'slim/logic_less'
You might want to activate logic less mode only for a few actions, you should disable logic-less mode globally at first in the configuration
Slim::Engine.set_options logic_less: false
and activate logic less mode per render call in your action
class Controller
def action
Slim::Engine.with_options(logic_less: true) do
render
end
end
end
## Logic less in Sinatra
Sinatra has built-in support for Slim. All you have to do is require the logic less Slim plugin. This can be done in your config.ru:
require 'slim/logic_less'
You are then ready to rock!
You might want to activate logic less mode only for a few actions, you should disable logic-less mode globally at first in the configuration
Slim::Engine.set_options logic_less: false
and activate logic less mode per render call in your application
get '/page'
slim :page, logic_less: true
end
## Options
| Type | Name | Default | Purpose |
| ---- | ---- | ------- | ------- |
| Boolean | :logic_less | true | Enable logic less mode (Enabled if 'slim/logic_less' is required) |
| String | :dictionary | "self" | Dictionary where variables are looked up |
| Symbol/Array<Symbol> | :dictionary_access | [:symbol, :string, :method, :instance_variable] | Dictionary access order (:symbol, :string, :method, :instance_variable) |