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!
加载中,请稍侯......
精彩评论