Движок Ramaze Haml каждый раз возвращает один и тот же шаблон - PullRequest
2 голосов
/ 14 января 2010

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

Вот шаги по воспроизведению проблемы:

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

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

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

Есть идеи?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 02 февраля 2010

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

2 голосов
/ 19 января 2010

Можете ли вы попытаться вернуть 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 связывается здесь с action.instance, где хранится @content.

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

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

1 голос
/ 18 января 2010

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

Innate::View.options.cache = false

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

0 голосов
/ 18 января 2010

Эта ошибка была зарегистрирована в канале #ramaze неделю назад ... для глухих, похоже, она еще не исправлена.

...