2010-10-20 86 views
18

我有一個簡單的sinatra應用程序,它使用haml和sass作爲視圖。其中一個視圖(位於視圖文件夾中)是我的導航菜單的一部分。我試圖從index.haml使其但我得到以下錯誤:錯誤的參數數目(1 2)如何渲染sinatra視圖中的部分(haml in haml)?

我想在index.haml以下行以使其

.navigation 
    = render :partial => "nav" 
+0

如果你想要更多的答案,我建議加上'ruby'到標籤 – kfl62 2010-10-20 07:59:31

回答

7

編輯:!!! OUTDATED !!!閱讀下面Jason's的答案!

你想在rails工作! Sinatra沒有partial方法。的partialSinatra的實現看起來像 this (source gist)從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 

包括這種方法,你可以調用你的.haml文件partial,像
= partial("partial_name")

如果你想render視圖中的其他查看語法是
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

注意語法差異和sinatra關於render方法!

+0

我真的不明白爲什麼有人會下降投一個明顯過時的答案。當時這是正確的。 LoL無所謂:) – kfl62 2013-04-20 14:22:56

+1

由於我看到人們仍然鏈接到這個答案,我從主要代碼中取得了代碼,並將它編入了一個gem,其中[Lenary](https://github.com/lenary)(the原作的作者)也自此作出了貢獻。它有後續的改進和規格等https://rubygems.org/gems/sinatra-partial。 – iain 2013-05-07 11:40:04

+0

我認爲最好是被拒絕投票,以便在上面列出更好的答案。那麼,我知道實際上不應該這樣做,但相反,SO應該有一個功能來處理過時的答案。 – 2014-09-02 14:30:05

12

或者你可以這樣做:

helpers do 
    def partial(page, options={}) 
    haml page.to_sym, options.merge!(:layout => false) 
    end 
end 

,包括你的局部有:

= partial("something-rad") 
7

這裏是我如何做到這一點(更簡單地比@ kfl62的回答,功能更豐富,比@ JM3的答案):

module Partials 
    def partial(page, variables={}) 
    haml page.to_sym, {layout:false}, variables 
    end 
end 
helpers Partials 

用它在你的Haml的文件裏柯:

%ul#comments 
    - @comments.each do |comment| 
    %li= partial :comment, comment:comment 
+0

我知道這是*令人難以置信的*舊Phrogz,但我想指出......「haml page.to_sym,{layout:false},變量」應該可能是 「haml page.to_sym,{:layout = > false},變量「 – user766987 2011-07-13 02:24:02

+0

@ user766987你說什麼適用於舊的1.8和1。9;我的答案是使用Ruby 1.9語法。 – Phrogz 2011-07-13 02:42:20

+0

永遠向你學習Phrogz,謝謝! :) – user766987 2011-07-13 18:32:13

55

你可以使用Sinatra的HAML功能:

= haml :nav 
+1

在代碼清潔方面,這勝過所有其他解決方案。 – Henson 2013-03-12 15:12:30

+1

這是迄今爲止最好的答案。你不需要任何特殊的代碼,它是內置的! – 2013-05-06 21:17:18

+0

如果您已將它設置爲正確使用紅地毯,您可以使用'= markdown:README' – 2014-08-06 21:34:36