2016-08-28 3 views
1

Я использую скомпилированный Heist. Мои сращивания выполняются только во время работы (без нагрузки). У меня есть template.tpl вроде этого:Передача данных непосредственно в шаблоны в скомпилированном Heist (Haskell)?

<html> 
<head> 
    <title><titleSplice/></title> 
</head> 
<body> 
    <bodySplice/> 
</body> 
</html> 

Это, как я делаю вещи:

  • В рамках акции оснастки для /:param маршрута, я использую renderTemplate heistState "template" получить MyHeistRuntimeMonad Builder.
  • Я могу передать значение :param моему сращиванию, поместив его в мою монадию выполнения через ReaderT: type MyHeistRuntimeMonad = ReaderT String IO. (Там, где String для переданного в :param значении.)

И это моя проблема. Единственный способ передать данные с моих маршрутов на мои сращивания - через монашескую временную монаду. Это усложняет ситуацию. Мои вопросы:

  1. Нет ли альтернативы renderTemplate, что позволяет мне передавать данные непосредственно в шаблон? Например, примерно так: renderTemplate' "template" [("titleSplice", "myTitle"), ("bodySplice", "myBody")].
  2. Если это невозможно, почему бы и нет? Мне просто интересно, почему все было спроектировано так, как они были. Я не совсем понимаю.

ответ

1

Пример того, что вы фокусируетесь на данных времени выполнения [("titleSplice", "myTitle"), ("bodySplice", "myBody")], намного меньше, чем модель, которую предоставляет Heist. Ваша модель - простая замена имени тега. Модель сплава Хейста - Node -> m [Node]. Это позволяет делать очень мощные вещи, такие как cache tag, markdown tag и даже head merging with the html tag.

Принцип трансформации монады Использование Heist было простой и очевидной реализацией, которая делает доступными все данные времени выполнения для сращиваний. Он также думает о сращиваниях как универсальном API, предоставляемом бэкэнд, который можно использовать в любом месте дизайнерами интерфейсов. Возможны ли другие формулировки? Я уверен, что есть. Но этот простой и мощный.

Ваша формулировка также очень специфична для шаблона. Если разработчик хотел добавить некоторые новые данные на страницу, вам придется изменить код Haskell, чтобы это учесть. При использовании подхода Хейста не потребовалось бы изменения кода Haskell. Это дает дизайнерам много возможностей менять вещи очень развязанным образом.

+0

Ничего себе. Я не полностью понял это, но это очень помогает. Кажется, существует какая-то реальная, глубокая философия, стоящая за тем, как работает Heist (и Snap). Если бы кто-нибудь написал книгу об этом! – haskellHQ

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