2010-01-14 2 views
2

매우 간단한 Ramaze 프로젝트에서 문제가 발생했습니다. 내 프로젝트는 Haml 템플릿 (컨트롤러/init.rb에서 'engine : Haml'을 설정)을 사용한다는 것을 제외하면 'ramaze create mywebsite'에서 생성 된 프로토 타입 프로젝트와 동일합니다.Ramaze의 Haml 엔진이 매번 같은 템플릿을 반환합니다.

    는 개발 서버를 시작
  1. : 여기

    문제를 재현하는 단계입니다. 나는 얇은 것을 사용하고 있습니다.
  2. 앱의 동작 중 하나를 방문합니다. 지금까지 나는 '/', '/ about', '/ signup'을 가지고 있습니다. 작업 템플릿이 올바르게 렌더링됩니다.
  3. 다른 작업을 수행하십시오. 이번에는 첫 번째 액션에 대해 렌더링 된 것과 똑같은 것이 반환됩니다.

dev 서버를 시작한 후 첫 번째 요청 만 올바르게 렌더링됩니다.

나는 Ramaze에 대한 기본 엔진으로 다시 전환 한 후에 모든 것이 정상적으로 작동하기 때문에 Haml과 관련이 있다고 생각합니다. 내 모든 보석은 최신입니다.

아이디어가 있으십니까?

감사합니다.

+0

전체 프로젝트 소스 코드를 조사 할 수 있습니까? github 프로젝트를 만들거나 http://gist.github.com을 사용하십시오. – Pistos

+0

다음은 설명한 문제가있는 예제 프로젝트입니다. http://github.com/alexebird/nohaml/ 또한이 문제는 템플릿이 레이아웃 내부에서 렌더링 될 때만 발생한다는 것을 알아 냈습니다. controller/init.rb의 "layout : default"행을 주석 처리하면 문제가 사라집니다. – alexebird

답변

3

Ramaze가 Haml보기를 처리하는 방식을 일부 개선 된 것으로 수정했습니다[email protected] 변수가 변경 되더라도 레이아웃 결과를 캐시합니다. 나중에이 문제가 발생하지 않도록 사양을 추가했습니다. spec/ramaze/view/haml.rb

1

해결 방법을 알아 냈습니다! 문제는 Innate :: View 캐싱 시스템과 관련됩니다. 보기 캐싱을 해제하면 다음과 같이 설정됩니다.

문제가 해결되었습니다. 분명히 이상적인 것은 아니지만 시간을두고 캐시를 사용하지 말고 Haml을 사용하십시오. 나는 Innate :: View에서 무엇이 잘못되었는지를 알아 내려고 노력하면서 시간을 보냈지만 아무 것도 찾지 못했습니다.

-1

1 주일 전에 #ramaze 채널에서이 버그가보고되었습니다. 아직 해결되지 않았기 때문에 귀가 먹었습니다.

2

Ramaze에서 haml.rb를 45db6fe0696dfac7deeebba42c62c6bcca8bab10을 커밋하기 전의 상태로 되돌릴 수 있습니까? 그게 내 애플 리케이션에 버그를 수정.

나는 버그가이로 인해 발생 가정

새로운 haml.rb이 버그를 일으키는 : render_proc의 반환 값이 캐시

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

. 사용 된 키는 처리되지 않은 레이아웃 Haml의 체크섬 인 AFAIK입니다. 문제는 여기서 render_proc@content이 저장된 action.instance에 바인딩된다는 것입니다.

즉, 동일한 레이아웃 (따라서 동일한 캐시 키)을 사용하여 페이지를 렌더링 할 때마다 첫 번째 페이지를 렌더링 할 때 사용한 것과 동일한 action.instance을 사용합니다. 그 결과 우리는 항상 같은 인스턴스 변수로 채워진 동일한 레이아웃을 얻게됩니다.

그 패치를 작성한 사람은 지역 변수 (content)를 인스턴스 변수 (@content) 대신 사용했다고 가정합니다. 레이아웃에서 @content 대신 content을 사용하면 버그가 사라집니다.

+0

답장을 보내 주셔서 감사합니다. 45db6fe로 되 돌리는 중 ... 내 앱이 고장났다. 플래시 도우미를 사용하고 있으며 플래시 메소드를 찾을 수 없다는 예외가 발생합니다. 바인딩에 대해 알고 있다고 생각하는 경우, Haml 렌더링 proc가 Object.new에 바인딩되어 발생하는 것처럼 보입니다. 물론 플래시 헬퍼가 포함되어 있지 않습니다. 2dd1012b4a396fcf18b983cfa6a36cc30fe1c903의 haml.rb를 사용하면 효과적입니다. – alexebird

+0

@content 대신에 content (local var)를 사용한다고해서 캐싱 문제가 완전히 해결되지는 않는다는 것을 알게되었습니다. 너무 많이 들여다 보지 않고 템플릿이 레이아웃으로 올바르게 렌더링되었지만 템플릿 자체는 업데이트되지 않은 것처럼 보입니다. – alexebird

+0

그래, 원래의 글은 약간 혼란 스러웠다 : 작업하는 haml.rb는 45db6을 커밋하기 이전과 동일했다. 그래서, haml.rb는 2dd1012에 있습니다. – hrnt

관련 문제