2012-01-23 2 views
1

약 1200 개의 카테고리가있는 홈 페이지에 게시 된 카테고리 트리가있는 웹 애플리케이션이 있습니다. 이 카테고리 트리는 acts_as_tree (parent_id 등)를 사용하여 빌드되며, <ul><li>을 사용하여 html로 트리를 만듭니다.레일 : 서버 시작시 미리로드/부분 생성

트리를 게시하면 완벽하게 정상적으로 작동하지만 정말 느리게 (~ 4 초로드 시간), 이는 분명히 홈 페이지에 좋지 않습니다.

좋은 점은이 카테고리 트리가 거의 변경되지 않기 때문에 서버를 시작할 때 빌드 할 수 있다는 것입니다. 따라서, 나는 초기화자인 category_tree.rb를 만들고 initializers-folder에 넣었습니다.

나는 글로벌 변수 $ category_tree을 만들어이 종류의이 같은에서 (이 지나치게 단순한 예입니다) "html로 삽입"

def create_tree(categories) 
    ret = '<ul>' 
    categories.each do |cat| 
    ret = "<li><a href='" + cat.url + "'>" + cat.name + "</a>" 
    end 
    ret = '</ul>' 
end 

$category_tree = create_tree(Category.all) 

하고, 내 인덱스보기에 단순히 넣어 :

<%= $category_tree %> 

이 모든 작품! 빠른 속도로 적재됩니다. <a href>은 장기적으로 매우 안정되지 않습니다 사용

  1. : 그러나, 나는 몇 가지 도움이 필요 몇 가지 문제가 있습니다. 내가 link_to 및 경로를 사용하는 것이 좋겠지 만 문제는 내 initializer가 routes.rb 앞에로드된다는 것입니다. 이것은 예를 들어 category_path를 호출하는 것을 불가능하게 만든다. 이 문제를 어떻게 해결할 수 있습니까? routes.rb가로드 된 후 category_tree.rb로드를 어떻게 만들 수 있습니까?

  2. 이와 같은 전역 변수를 사용하는 것이 매우 현명한 지 모르겠습니다. 나는 항상 내 범주 트리 html을 메모리에 유지할 것이라고 상상한다. 나는 너무 똑똑하지 않다고 생각한다. 이 올바른지?

내가 선호하는 것은 경로/경로를 사용할 수있는 HTML 카테고리 트리가 포함 된 시작시 부분을 만드는 경우입니다. 메모리에 아무것도 저장할 필요가없는 솔루션입니다. 어떻게 해결할 수 있습니까?

답변

2

페이지를 렌더링 한 후에 캐싱해야하는 것처럼 보입니다. 변경되면 캐시를 무효로하고로드하여 새 캐시 된 버전을 저장하십시오.

http://guides.rubyonrails.org/caching_with_rails.html

+0

정확하게 내가 무엇을 찾고 있었습니까. 매력처럼 일했습니다! – Christoffer

+0

문제가 해결되었다고 들었습니다. –

관련 문제