2010-10-20 15 views
18

J'ai une application sinatra simple qui utilise haml et sass pour les vues. L'une des vues (située dans le dossier views) est partielle pour mon menu de navigation. Je suis en train de le rendre de index.haml mais je reçois l'erreur suivante: mauvais nombre d'arguments (1 pour 2)Comment rendre une vue partielle en sinatra (haml en haml)?

Je suis en train de le rendre avec les lignes suivantes dans index.haml

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

Si vous voulez plus de réponses que je suggère d'ajouter 'ruby' aux balises – kfl62

Répondre

7

EDIT: !!! OUTDATED !!! Lire Jason's répondre ci-dessous!

Qu'est-ce que vous essayez fonctionne dans rails! Sinatra n'a pas de méthode partial. Une mise en œuvre de partial sur Sinatra ressemble this (source gist) de 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 

Y compris cette méthode, vous pouvez appeler partial dans vos .haml fichiers, comme
= partial("partial_name")

Si vous voulez render une vue dans une autre la syntaxe de vue est
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

Notez les différences de syntaxe entre les deux n rails et sinatra concernant la méthode render!

+0

Je ne comprends vraiment pas pourquoi quelqu'un serait en bas voter une réponse manifestement désuète. À l'époque, c'était la bonne. LoL n'a pas d'importance :) – kfl62

+1

Depuis que je vois que les gens sont toujours liés à cette réponse, j'ai pris le code de l'essentiel et l'ai transformé en un bijou, qui [Lenary] (https://github.com/lenary) (le auteur de l'original) a également depuis contribué à. Il a des améliorations et des spécifications, etc. https://rubygems.org/gems/sinatra-partial. – iain

+0

Je pense qu'il serait préférable d'être abattu afin qu'une meilleure réponse puisse être listée dessus. Eh bien, je sais que cela ne devrait pas être fait comme ça, mais plutôt SO devrait avoir une fonctionnalité pour gérer une réponse périmée. –

12

Ou vous pouvez simplement faire ceci:

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

Et inclure votre partie avec:

= partial("something-rad") 
7

Voici comment je le fais (plus simplement que la réponse de @ kfl62, plus riche en fonctionnalités que @ la réponse de JM3):

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

utiliser dans votre fichier Haml li ke:

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

Je sais que c'est * incroyablement * vieux Phrogz, mais quelque chose que je voulais souligner ... "haml page.to_sym, {layout: false}, variables" devrait probablement être "haml page.to_sym, {: layout = > false}, variables " – user766987

+0

@ user766987 Ce que vous dites fonctionne pour les anciens 1.8 et 1.9; Ma réponse utilise la syntaxe Ruby 1.9. – Phrogz

+0

Toujours apprendre de vous Phrogz, merci! :) – user766987

55

Vous pouvez simplement utiliser la fonction haml de Sinatra:

= haml :nav 
+1

En termes de propreté du code, cela l'emporte sur toutes les autres solutions. – Henson

+1

C'est de loin la meilleure réponse. Vous n'avez pas besoin de code spécial, c'est intégré! –

+0

vous pouvez faire une pause en utilisant '= markdown: README' si vous l'avez configuré pour utiliser correctement redcarpet –