Движок Ramaze Haml каждый раз возвращает один и тот же шаблон

У меня возникла проблема с моим очень простым проектом Ramaze. Мой проект идентичен проекту-прототипу, созданному из 'ramaze create mywebsite', за исключением того, что я использую шаблоны Haml (я установил 'engine:Haml' в controller/init.rb).

Вот шаги, чтобы воспроизвести проблему:

  1. Запустите сервер разработки. Я использую Тонкий.
  2. Посетите одно из действий в приложении. Пока что у меня есть "/", "/ about" и "/ signup". Шаблон для действия будет отображен правильно.
  3. Посетите другое действие. На этот раз будет возвращено то же самое, что было сделано для первого действия.

Только первый запрос после запуска сервера разработки будет обработан правильно.

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

Есть идеи?

Спасибо!

4 ответа

Решение

Исправлено это путем возврата некоторых предполагаемых улучшений в способ, которым Ramaze обрабатывает представления Haml. Это кеширует результат компоновки, даже если переменная @content изменилась. Я также добавил спецификацию, чтобы это не могло произойти в будущем: spec / ramaze / view / haml.rb

Можете ли вы попытаться вернуть haml.rb в состояние, в котором он был до фиксации 45db6fe0696dfac7deeebba42c62c6bcca8bab10 на вашем Ramaze? Это исправило ошибку в моем приложении.

Я предполагаю, что ошибка вызвана этим:

Новый haml.rb, вызывающий ошибку:

haml = View.compile(string) do |s|
  ::Haml::Engine.new(s,options).render_proc(action.instance,*action.variables.keys)
end

Возвращаемое значение render_proc кэшируется Используемый ключ, AFAIK, контрольная сумма необработанного макета Haml. Проблема в том, что render_proc привязывается здесь к действию. Например, где @content хранится.

Это означает, что каждый раз, когда мы визуализируем страницу, используя один и тот же макет (и, следовательно, один и тот же ключ кэша), мы используем один и тот же action.instance мы использовали при рендеринге первой страницы. В результате мы всегда получаем одинаковый макет, заполненный одинаковыми переменными экземпляра.

Я думаю, что человек, который сделал этот патч, предполагал, что люди использовали локальные переменные (content) в их макете вместо переменных экземпляра (@content). Действительно, если content используется вместо @content в макете ошибка, кажется, исчезает.

Разобравшийся обходной путь! Проблема связана с системой кэширования Innate::View. Отключив кеширование просмотра:

Innate::View.options.cache = false

проблема исправлена. Очевидно, что это не идеально, но я бы предпочел не кэшировать представления и пока использовать Haml. Я потратил некоторое время, пытаясь выяснить, что не так в Innate::View, но ничего не нашел.

Об этой ошибке сообщили в канале #ramaze неделю назад... кажется, что она еще не исправлена.

Другие вопросы по тегам