Передача локальных переменных данных между макетом и шаблоном

Мне нужно иметь возможность делиться локальными данными (в файле 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 этот маршрут не представляется возможным.


person lyonsinbeta    schedule 26.01.2015    source источник
comment
Можете ли вы опубликовать код? Когда вы доступны из макета, что вы имеете в виду? Будут ли эти данные в файле YAML всегда актуальными?   -  person Beartech    schedule 27.01.2015
comment
Под доступом из макета я имею в виду, что я хочу, чтобы макет включал данные, о которых знает шаблон. Пример: в шаблоне есть информация об авторе поста в блоге, затем в макете есть боковая панель с информацией об этом авторе. Макет должен знать информацию об авторе, объявленную в шаблоне. Как или всегда актуальный Я не уверен, что именно вы имеете в виду, но моя интуиция подсказывает, что да, это было бы. Данные в этом файле YAML не будут часто меняться.   -  person lyonsinbeta    schedule 27.01.2015
comment
Лучше использовать @data вместо data   -  person dddd1919    schedule 27.01.2015
comment
Не могу поверить, что это было так просто. Большое спасибо. С этого дня я буду воспевать имя @dddd1919 в высочайшем почете.   -  person lyonsinbeta    schedule 27.01.2015
comment
Кстати, установка этой логической операции в шаблоне не лучший способ, лучше поместить контроллер или помощник   -  person dddd1919    schedule 27.01.2015
comment
@dddd1919 Я знаю, что переменные можно передавать из config.rb в шаблон/макеты через блоки page do и helpers, но я должен объявить их в шаблоне, потому что у меня несколько блогов и мне нужны разные данные для каждого шаблона блога, которые нужно передать в один и тот же макет. Ответ, который вы мне дали, прекрасно работает. Есть ли какая-то причина не делать это таким образом?   -  person lyonsinbeta    schedule 27.01.2015
comment
Просто соглашение по умолчанию в рельсах. Хотя ни один способ не может достичь этой цели, но помощник может сделать это лучше, чтобы ваши товарищи поняли вашу идею.   -  person dddd1919    schedule 27.01.2015
comment
Любая причина, по которой вы не используете встроенные в Middlemans возможности локальных данных или frontmatter? Их комбинация должна соответствовать вашему варианту использования.   -  person Volker Rose    schedule 27.01.2015


Ответы (1)


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

# In your template
<% @my_var = YAML.load_file("path/to/data.yml") %>

# In your layout
<p>My_var contains: <%= @my_var %></p>

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

Большое спасибо @dddd1919 за то, что сбросил эту информационную бомбу.

person lyonsinbeta    schedule 27.01.2015
comment
Звучит очень красиво, подумал, что было бы здорово, если бы был способ оценить переменные? Скажем, например, вы добавляете частичный путь в свой файл yaml, было бы неплохо получить уже предварительно обработанный контент. - person Andrea Moro; 01.02.2015