Добавление шаблона и нескольких частичных элементов в макет - PullRequest
0 голосов
/ 08 октября 2009

Прежде всего, позвольте мне сказать, что я знаком с content_for. Это не совсем то, что я ищу здесь.

Я хочу разрешить шаблону и любому числу парциальных составляющих, скажем, список файлов JavaScript, которые я хочу загрузить, и передать их в макет для его обработки и добавления в область <head>. Я хочу загружать файлы только в том случае, если они действительно нужны странице, поэтому я не хотел бы просто помещать их все в макет. Также не похоже, что что-то должно обрабатываться контроллером, потому что это в основном изменения, зависящие от вида.

Я пытался использовать content_for для возврата массива имен, но это, похоже, не работает. Это также не позволило бы нескольким частям добавлять свои собственные предпосылки в список. Я также попытался использовать вспомогательные функции в шаблоне / partials для добавления в список, а затем использовать этот список в макете, но похоже, что код макета оценивается перед кодом шаблона.

Есть идеи? Кстати, это не специфично для JavaScript; Мне просто нужен способ передать объекты Ruby из шаблона / частичного в макет.

РЕДАКТИРОВАТЬ: По запросу, пример. css_import - это всего лишь помощник, который я написал, который эмулирует CSS @import.

# In the layout
<style type="text/css">
<%- yield(:foobar).each do |foo| -%>
  <%= css_import foo %>
<%- end -%>
</style>

# In the template
<%- content_for :foobar do
  ['layout', 'recipes', 'user']
end -%>

# The actual output from View -> Source
<style type="text/css"> 
</style>

1 Ответ

1 голос
/ 08 октября 2009

Может быть, вам стоит взглянуть на то, что делает content_for? Он просто выполняет блок, назначенный вызову, и сохраняет его в переменной экземпляра. При вызове yield с правильным параметром он возвращает переменную экземпляра.

Должно быть вполне возможно создать два собственных вспомогательных метода для достижения вашей цели, например:

def register(key, value)
    @registry[key] = value
end

def fetch(key)
    @registry[key]
end

Вы можете сделать эти функции настолько удобными, насколько вам нравится, например, когда реестр содержит только местоположения для файлов JavaScript, вы можете вернуть HTML-теги JavaScript вместо вместо пути к файлу.

...