Мне нужно иметь возможность делиться локальными данными (в файле yaml) из шаблонов с макетом. Я хочу иметь возможность загружать соответствующие данные YAML в шаблон, а затем иметь доступ к этим данным из макета (и связанных с ними частей). Это возможно?
Я нашел это сообщение в блоге, которое кажется указать, что это возможно с помощью некоторых махинаций, но я не могу заставить его работать, и это кажется хакерским. Есть ли встроенный способ передачи данных между шаблонами и макетами? А если нет, можно ли заставить работать хак в этом блоге?
Обновление: добавлен код!
Вот код из сообщения в блоге, связанного выше. Я попробовал это точно так же, как показано, и немного поиграл с ним, но не в кости.
# in your layout file (inside layout/ folder):
<% myvar = yield_content :myvar %>
<% myvar = eval(myvar.to_str) %>
# in your template file (e.g., mypage.html.erb):
<% content_for :myvar, data.somefile %>
# this examples assumes there's a somefile.yml in your data/ folder:
name: hello world
tag: the quick brown jumps over the lazy dog
Приведенный выше код вернул no implicit conversion of nil into String
, что звучит так, как будто файл YAML либо не загрузился, либо не был передан в макет (поскольку он загружен в шаблоне). Я подтвердил, что он загружался в шаблоне, поэтому, возможно, он не был передан в шаблон по какой-то причине? (Кроме того: как начинающего программиста меня учили, что eval
— это дьявольская работа и «никогда не использовать его», поэтому это решение кажется мне схематичным.)
Сам я попытался сделать что-то вроде приведенного ниже, и если YAML загружается в шаблон следующим образом:
data = YAML.load_file('some/file/data.yml')
он отлично работает внутри шаблона, но макет выдает undefined local variable
ошибок.
То же самое, но в обратном порядке, если вы загрузите YAML в макет, он не будет доступен в шаблоне. Кроме того, я не хочу, чтобы данные загружались в макет, потому что они будут отличаться в зависимости от шаблона, из которого они исходят.
В идеале я бы просто передал загруженные данные YAML из шаблона в макет, но я думаю, что мог бы также достичь своей конечной цели, если бы макет был новым, для какого блога (это сайт с несколькими блогами) он вызывался. Однако после разговора с некоторыми людьми из команды Middleman этот маршрут не представляется возможным.
@data
вместоdata
- person dddd1919   schedule 27.01.2015config.rb
в шаблон/макеты через блокиpage do
иhelpers
, но я должен объявить их в шаблоне, потому что у меня несколько блогов и мне нужны разные данные для каждого шаблона блога, которые нужно передать в один и тот же макет. Ответ, который вы мне дали, прекрасно работает. Есть ли какая-то причина не делать это таким образом? - person lyonsinbeta   schedule 27.01.2015