diff --git a/README.de.rdoc b/README.de.rdoc index 92a0922c..50d0022a 100644 --- a/README.de.rdoc +++ b/README.de.rdoc @@ -300,6 +300,24 @@ Das less gem wird benötigt um Less-Templates rendern zu können: Dieser Code rendert ./views/stylesheet.less. +=== Liquid Templates + +Das liquid gem wird benötigt um Liquid-Templates rendern zu können: + + ## liquid muss eingebunden werden + require 'liquid' + + get '/' do + liquid :index + end + +Dieser Code rendert ./views/index.liquid. + +Da man aus Liquid-Templates heraus keine Methoden (abgesehen von +yield+) +aufrufen kann, will man nahezu in allen Fällen +locals+ übergeben: + + liquid :index, :locals => { :key => 'value' } + === Inline Templates get '/' do diff --git a/README.rdoc b/README.rdoc index c0ca9e7c..92fecbe3 100644 --- a/README.rdoc +++ b/README.rdoc @@ -296,6 +296,24 @@ The less gem/library is required to render Less templates: Renders ./views/stylesheet.less. +=== Liquid Templates + +The liquid gem/library is required to render Liquid templates: + + ## You'll need to require liquid in your app + require 'liquid' + + get '/' do + liquid :index + end + +Renders ./views/index.liquid. + +Since you cannot call Ruby methods (except for +yield+) from a Liquid +template, you almost always want to pass locals to it: + + liquid :index, :locals => { :key => 'value' } + === Inline Templates get '/' do diff --git a/lib/sinatra/base.rb b/lib/sinatra/base.rb index 3ec9c592..44c91158 100644 --- a/lib/sinatra/base.rb +++ b/lib/sinatra/base.rb @@ -335,6 +335,10 @@ module Sinatra render :builder, template, options, locals end + def liquid(template, options={}, locals={}) + render :liquid, template, options, locals + end + private def render(engine, data, options={}, locals={}, &block) # merge app-level options diff --git a/sinatra.gemspec b/sinatra.gemspec index 0635965e..dd8a52e0 100644 --- a/sinatra.gemspec +++ b/sinatra.gemspec @@ -86,6 +86,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'builder' s.add_development_dependency 'erubis' s.add_development_dependency 'less' + s.add_development_dependency 'liquid' s.has_rdoc = true s.homepage = "http://sinatra.rubyforge.org" diff --git a/test/liquid_test.rb b/test/liquid_test.rb new file mode 100644 index 00000000..3315bd16 --- /dev/null +++ b/test/liquid_test.rb @@ -0,0 +1,58 @@ +require File.dirname(__FILE__) + '/helper' + +begin +require 'liquid' + +class LiquidTest < Test::Unit::TestCase + def liquid_app(&block) + mock_app do + set :views, File.dirname(__FILE__) + '/views' + get '/', &block + end + get '/' + end + + it 'renders inline liquid strings' do + liquid_app { liquid '
Hello World
\n", body + end + + it "raises error if template not found" do + mock_app { get('/') { liquid :no_such_template } } + assert_raise(Errno::ENOENT) { get('/') } + end + + it "allows passing locals" do + liquid_app do + liquid '{{ value }}', :locals => { :value => 'foo' } + end + assert ok? + assert_equal 'foo', body + end +end +rescue + warn "#{$!.to_s}: skipping liquid tests" +end diff --git a/test/views/hello.liquid b/test/views/hello.liquid new file mode 100644 index 00000000..00d7d26c --- /dev/null +++ b/test/views/hello.liquid @@ -0,0 +1 @@ +{{ yield }}