2013-11-12 2 views
2

Я пишу помощник для небольшого приложения Sinatra, которое печатает некоторые игровые карты, хранящиеся как хэш в массиве.Вставьте HAML в помощник Sinatra

Каждая карта имеет такую ​​структуру:

{ card: 'Ace', suit: :spades, value: 11 } 

и имя файла изображения карты является "spades_11.jpg".

Я пишу помощника для отображения карты на мой взгляд:

def view(hand) 
    hand.each do |card| 
    #print the card 
    end 
end 

Мне нужен выход, как это:

.span2 
    %img(src="/images/#{card[:suite]}_#{card[:value]}") 

Как я могу вставить свой код Haml внутри хелперов блока сохраняя отступы?

ответ

2

Самым простым решением было бы просто вернуть HTML непосредственно из вашего помощника в виде строки:

def view(hand) 
    hand.map do |card| 
    "<div class='span2'><img src='/images/#{card[:suite]}_#{card[:value]}'></div>" 
    end.join 
end 

на вызов его из Haml что-то вроде:

= view(@the_hand) 

Вы могли бы использовать из haml_tag helper, который позволит вам написать что-то вроде:

def view(hand) 
    hand.each do |card| 
    haml_tag '.span2' do 
     haml_tag :img, 'src' => "/images/#{card[:suite]}_#{card[:value]}" 
    end 
    end 
end 

Обратите внимание, что haml_tag пишет непосредственно на выход, а не возвращает строку, так что вы должны использовать его с -, а не =:

- view(@the_hand) 

или использовать capture_haml.

Этот метод означает, что ваш помощник зависит от Haml. Первый метод можно использовать независимо от используемого языка шаблонов, но не будет учитывать такие настройки, как format, для того, чтобы закончить тег img с помощью />.

Если вы хотите использовать чистую Haml для разметки для каждой карты (этот пример достаточно прост, чтобы уйти с помощниками, но вы наверняка захотите сделать это для более сложных разделов), вы можете использовать частичный. Добавьте код Haml в файл с именем, например.view.haml, то вы можете сделать это из шаблона, содержащего, передавая в руки в качестве локальной переменной:

view.haml: шаблон

- hand.each do |card| 
    .span2 
    %img(src="/images/#{card[:suite]}_#{card[:value]}") 

Родитель:

= haml :view, :locals => {:hand => @the_hand} 
2

Вы должны быть в состоянии использовать here doc

def view(hand) 
    hand.each do |card| 
    <<-HAML 
.span2 
    %img(src="/images/#{card[:suite]}_#{card[:value]}") 
    HAML 
    end 
end 

, но обратите внимание, что здесь документы взять пробелы из начала линии находятся на, так, к сожалению, это сделает ваш отступы несколько некрасиво.

Для чего-то более сложного, возможно, имеет смысл написать ваш haml в отдельном файле .haml.

Смежные вопросы