markup = "Welcome, {{ user.name }}"
user = User.find(1337)
t = Liquid::Template.parse(markup)
t.render('user' => user)
Slide 17
Slide 17 text
Welcome, !
Slide 18
Slide 18 text
Liquid Has Trust Issues
Slide 19
Slide 19 text
Deny By Default
Slide 20
Slide 20 text
class Person < ActiveRecord::Base
end
# denied!
"{{ person.name }}" => ""
class Person < ActiveRecord::Base
liquid_methods :name
end
# okay!
"{{ person.name }}" => "Cmdr Shepard"
Slide 21
Slide 21 text
markup = "Welcome, {{ user.name }}"
user = User.find(1337)
t = Liquid::Template.parse(markup)
t.render('user' => user)
Slide 22
Slide 22 text
Welcome, Jon ‘maddog’ Hall!
* If you don’t know who he is, check Wikipedia.
Slide 23
Slide 23 text
Live Free
Or Die.
Slide 24
Slide 24 text
Actually Rendering
Templates
Slide 25
Slide 25 text
# load the user from somewhere.
t = Liquid::Template.parse(markup)
t.render("user" => user)
Slide 26
Slide 26 text
t = Liquid::Template.parse(markup)
context = Liquid::Context.new(*args)
t.render(context)
class FileSystem
def initialize(*args)
# whatever
end
def read_template_file(name, context)
# fetches partials from wherever
end
end
{% include 'some-partial' %}
Slide 34
Slide 34 text
# a block
{% if liquid == 'awesome' %}
You should try Liquid!
{% endif %}
# a tag
{% assign liquid = 'awesome' %}
Slide 35
Slide 35 text
class ExampleTag < Liquid::Tag
def initialize(name, markup, tokens)
# setup the tag, parse stuff, ya know...
# expensive stuff.
end
def render(context)
# drop in the assigns and go!
# should be cheap.
end
end
Slide 36
Slide 36 text
class ExampleTag < Liquid::Tag
def initialize(name, markup, tokens)
# setup the tag, parse stuff, ya know...
# expensive stuff.
end
def render(context)
# drop in the assigns and go!
# should be cheap.
end
end
Slide 37
Slide 37 text
class PersonDrop < Liquid::Drop
def addresses
# stupid slow operation
Address::find_by_person(@person)
end
end
{{ user.addresses }}
Slide 38
Slide 38 text
{{ “hello world” | capitalize }}
# shamelessly stolen from
# liquid's source. use your
# imagination people!
def capitalize(input)
input.to_s.capitalize
end
Slide 39
Slide 39 text
Liquid Philosophies
Slide 40
Slide 40 text
•assume hostile environment
•white list what you need
•deny everything else
Slide 41
Slide 41 text
•can edit markup
•is probably non-technical
Assume the client
Slide 42
Slide 42 text
•ignore errors by default
•don’t let the client break
too much