Движок Ramaze Haml каждый раз возвращает один и тот же шаблон
У меня возникла проблема с моим очень простым проектом Ramaze. Мой проект идентичен проекту-прототипу, созданному из 'ramaze create mywebsite', за исключением того, что я использую шаблоны Haml (я установил 'engine:Haml' в controller/init.rb).
Вот шаги, чтобы воспроизвести проблему:
- Запустите сервер разработки. Я использую Тонкий.
- Посетите одно из действий в приложении. Пока что у меня есть "/", "/ about" и "/ signup". Шаблон для действия будет отображен правильно.
- Посетите другое действие. На этот раз будет возвращено то же самое, что было сделано для первого действия.
Только первый запрос после запуска сервера разработки будет обработан правильно.
Я только думаю, что это как-то связано с 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 неделю назад... кажется, что она еще не исправлена.