Как сделать частичное в синатре (хамл в хамле)? - PullRequest
18 голосов
/ 20 октября 2010

У меня есть простое приложение sinatra, которое использует haml и sass для просмотра.Одно из представлений (находится в папке представлений) является частичным для моего меню навигации.Я пытаюсь сделать это из index.haml, но получаю следующую ошибку: неверное количество аргументов (1 для 2)

Я пытаюсь сделать это со следующими строками в index.haml

.navigation
  = render :partial => "nav"

Ответы [ 4 ]

59 голосов
/ 30 апреля 2012

Вы можете просто использовать функцию хамла Синатры:

= haml :nav
13 голосов
/ 19 июня 2011

Или вы можете просто сделать это:

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

И включите ваш частичный с:

= partial( "something-rad" )
8 голосов
/ 02 июля 2011

Вот как я это делаю (проще, чем ответ @ 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
7 голосов
/ 20 октября 2010

РЕДАКТИРОВАТЬ: !!! УСТАРЕЛО !!! Читать Джейсон ответ ниже!

Что вы пытаетесь работает в rails! Sinatra не имеет partial метода. Реализация partial в Sinatra выглядит как this (исходная сущность) из 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

Включая этот метод, вы можете вызывать partial в ваших .haml файлах, например
= partial("partial_name")

Если вы хотите render, представление в синтаксисе другого представления будет
= render(:haml,:'rel_path_to_view',:locals => {:optional => option})

Обратите внимание на синтаксические различия между rails и sinatra в отношении render метода!

...