Как использовать помощника Синатры в модели? - PullRequest
4 голосов
/ 27 марта 2011

В одной из моих моделей у меня есть метод, который отправляет электронное письмо. Я хотел бы отметить это письмо с помощью файла Haml, который хранится вместе с другими моими представлениями.

Есть ли способ вызвать HAML-помощника Синатры изнутри модели? Если нет, мне нужно будет позвонить Хамлу напрямую, вот так:

@name = 'John Doe'
Haml::Engine.new(File.read("#{MyApplication.views}/email.haml")).to_html

Есть ли способ для шаблона Haml иметь доступ к переменной экземпляра @name?

Ответы [ 3 ]

5 голосов
/ 27 марта 2011

Попробуйте что-то вроде этого:

tmpl = Tilt.new("#{MyApplication.views}/email.haml")
tmpl.render(self) # render the template with the current model instance as the context

Надеюсь, это поможет!

4 голосов
/ 06 апреля 2011

Не используя Tilt, вы можете просто сделать это в Haml:

require 'haml'
@name = 'John Doe'
html = Haml::Engine.new('%p= @name').render(self)
#=> "<p>John Doe</p>\n"

Значение self, переданное в , render метод является ключом, обеспечиваяобласть, в которой будет оцениваться шаблон.

Конечно, вы можете предоставить строку шаблона Haml либо напрямую, как указано выше, либо считав ее из файла:

Haml::Engine.new(IO.read(myfile)).render(self)
1 голос
/ 27 марта 2011

Я не уверен, что HAML - хороший выбор для электронной почты.Я бы использовал ERB или Erubis, потому что они позволяют больше рендеринга произвольной формы, который будет хорошо работать для заполнения переменных полей.

Если вы создаете HTML-вложение к письму MIME, тогда HAML будет хорошим выборомчасть сообщения, но, опять же, я бы, вероятно, взял ERB или Erubis для создания как текстовой части тела MIME, так и HTML-части.

Если вы не хотите использовать ERB / ​​Erubisпосмотрите на использование обычной строки «здесь к», такой как:

body = <<EOT
Dear #{whoever},

You owe me #{ lots_of_dollars } bucks. Pay by #{ when_i_need_it } or I'll shave my yak.

Your's truly,

#{ who_i_am }
EOT

Я думаю, что HAML - отличный инструмент, но, на мой взгляд, он не совсем подходит для этой ситуации.

...