2010-10-20 18 views
18

Ho una semplice app sinatra che usa haml e sass per le viste. Una delle viste (che si trova nella cartella delle viste) è parziale per il mio menu di navigazione. Sto cercando di renderlo da index.haml ma ottengo il seguente errore: il numero errato di argomenti (1 per 2)Come rendere un partial in vista sinatra (haml in haml)?

Sto cercando di renderlo con le seguenti righe nel index.haml

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

Se volete più risposte mi permetto di suggerire di aggiungere 'ruby' ai tag – kfl62

risposta

7

EDIT: !!! ESAURITO !!! Leggi la risposta Jason's qui sotto!

Cosa stai cercando funziona in rails! Sinatra non ha il metodo partial. Un'implementazione di partial su Sinatra sembra this (source gist) da 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 

Compreso questo metodo, è possibile chiamare partial nei file .haml, come
= partial("partial_name")

Se si vuole render una vista in un altro visualizza la sintassi è
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

Notare le differenze di sintassi tra n rails e sinatra per il metodo render!

+0

Io veramente non capisco perché qualcuno avrebbe giù votare una risposta ovviamente obsoleta. Al momento questo era quello giusto. LoL non importa :) – kfl62

+1

Dal momento che vedo che le persone stanno ancora collegando questa risposta, ho preso il codice dall'elenco e l'ho trasformato in una gemma, che [Lenary] (https://github.com/lenary) (il autore del gist originale) ha anche contribuito a. Ha successivi miglioramenti e specifiche ecc. Https://rubygems.org/gems/sinatra-partial. – iain

+0

Penso che sarebbe meglio essere votati in modo che una risposta migliore possa essere elencata sopra. Beh, so che in realtà non dovrebbe essere fatto così, ma SO dovrebbe avere una funzionalità per gestire una risposta obsoleta. –

12

Oppure si può semplicemente fare questo:

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

E includere il parziale con:

= partial("something-rad") 
7

Ecco come lo faccio (più semplicemente di @ di kfl62 risposta, ricco di funzionalità più di @ La risposta di JM3):

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

utilizzare nel vostro file di li Haml Ke:

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

So che questo * incredibilmente * vecchio Phrogz, ma qualcosa che volevo sottolineare ... "haml page.to_sym, {layout: falso}, variabili" dovrebbe probabilmente essere "haml page.to_sym, {: layout = > false}, variabili " – user766987

+0

@ user766987 Quello che dici funziona per i vecchi 1.8 e 1.9; la mia risposta sta usando la sintassi di Ruby 1.9. – Phrogz

+0

Sempre imparando da te Phrogz, grazie! :) – user766987

55

Si può semplicemente utilizzare la funzione Haml di Sinatra:

= haml :nav 
+1

In termini di pulizia del codice, questo trionfa su tutte le altre soluzioni. – Henson

+1

Questa è di gran lunga la migliore risposta. Non hai bisogno di alcun codice speciale, è integrato! –

+0

puoi usare con '= markdown: README' se hai configurato per usare correttamente redcarpet –