How to render a partial in sinatra view (haml in haml)?

被刻印的时光 ゝ 提交于 2019-12-03 04:22:46

问题


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.haml

.navigation
  = render :partial => "nav"

回答1:


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!




回答2:


You can just use Sinatra's haml function:

= haml :nav



回答3:


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" )



回答4:


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


来源:https://stackoverflow.com/questions/3974878/how-to-render-a-partial-in-sinatra-view-haml-in-haml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!