content_for против yield в партиалах - PullRequest
9 голосов
/ 08 февраля 2012

В рельсах 3.0 с HAML (3.1.4) у меня есть

  1. некоторый шаблоноподобный частичный , такой как _template.html.haml:

    .panel.top
      = yield :panel_top
    
    .content
      = yield
    
  2. какой-то другой частичный , который будет отображаться с использованием шаблона prev (все эти материалы отображаются с использованием AJAX, но это не имеет значения)

    - content_for :panel_top do
     .title.left
       = title
    
    content text
    

и это работало как прелесть в Rails 3.0

Но после обновления до 3.2 это не удалось!Yiels просто возвращает «текст содержимого», поэтому у меня есть «текст содержимого» дважды, а заголовка нет вообще

только изменение = yield :panel_top на = content_for :panel_top работает на 3,2

ЯЯ не уверен, что это решение в порядке, и если оно стабильно или рекомендовано, я не могу найти никаких замечаний об изменениях в yield обработке, ни в примечаниях к выпуску Rails 3.1, ни в 3.2.

наилучший способ организации yield внутри партиалов?

1 Ответ

10 голосов
/ 04 мая 2012

Из Rails 3.0 в Rails 3.2 content_for было действительно изменено:

3.0 :

def content_for(name, content = nil, &block)
    content = capture(&block) if block_given?
    @_content_for[name] << content if content
    @_content_for[name] unless content
end

3.2 :

def content_for(name, content = nil, &block)
  if content || block_given?
    content = capture(&block) if block_given?
    @view_flow.append(name, content) if content
    nil
  else
    @view_flow.get(name)
  end
end

Это показывает нам, что из 3.2 content_for также работает для показа / вставки контента, не только для сохранения его для именованного раздела.

Также, если вы пытаетесь отладить yieldлогика, которую вы увидите, что она дает до правильной инициализации content_for.

Таким образом, оставляя фрагмент кэширования из этого обсуждения, я могу заключить, что content_for является предпочтительным способом вставки именованныхразделы в любом месте, кроме макетов верхнего уровня.В помощниках и других ситуациях yield должно давать неверные результаты.

...