How to render a partial in sinatra view (haml in haml)?
I have a simple sinatra app that uses haml and sass for the views. One of the views (located in the views folder) is a partial for my navigation menu. I am trying to render it from index.haml but I get the following error: wrong number of arguments (1 for 2)
I am trying to render it with the following lines in index.ham开发者_运维问答l
.navigation
= render :partial => "nav"
You can just use Sinatra's haml function:
= haml :nav
Or you could just do this:
helpers do
def partial(page, options={})
haml page.to_sym, options.merge!(:layout => false)
end
end
And include your partial with:
= partial( "something-rad" )
Here's how I do it (more simply than @kfl62's answer, more feature-rich than @jm3's answer):
module Partials
def partial( page, variables={} )
haml page.to_sym, {layout:false}, variables
end
end
helpers Partials
Use it in your Haml file like:
%ul#comments
- @comments.each do |comment|
%li= partial :comment, comment:comment
EDIT: !!! OUTDATED !!! Read Jason's answer below!
What are you trying works in rails
! Sinatra
has no partial
method. An implementation of partial
on Sinatra
looks like this (source gist) from github:
module Haml
module Helpers
def partial(template, *args)
template_array = template.to_s.split('/')
template = template_array[0..-2].join('/') + "/_#{template_array[-1]}"
options = args.last.is_a?(Hash) ? args.pop : {}
options.merge!(:layout => false)
if collection = options.delete(:collection) then
collection.inject([]) do |buffer, member|
buffer << haml(:"#{template}", options.merge(:layout =>
false, :locals => {template_array[-1].to_sym => member}))
end.join("\n")
else
haml(:"#{template}", options)
end
end
end
end
Including this method, you may call partial
in your .haml
files, like
= partial("partial_name")
If you want to render
a view in an other view syntax is
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})
Notice the syntax differences between rails
and sinatra
regarding render
method!
精彩评论