2010-05-04 3 views
6

를 나누기. 문제는 배포 후 처음 몇 페이지를로드해도 페이지에 CSS 또는 js가 표시되지 않는다는 것입니다. 나는 캐시 된 all.js와 all.css가 다시 생성 될 때까지 추측한다.레일 자산 캐싱 우리는이 같은 레일 자산 JS에 대한 캐싱 및 CSS를 사용하는 처음 몇 페이지가로드

우리는 하루에 여러 번 배포하며, 파열 된 페이지를 발견 한 사용자에게는 무섭습니다.

새로운 캐시 된 에셋이 첫 번째 새 페이지로드시에 존재하도록 보장하는 방법을 찾았습니까?

+0

몇 가지 질문 : 1) 서로 다른 컴퓨터에 여러 개의 앱 서버가 있습니까? 2) 템플릿의 CSS 캐시 라인은 무엇입니까? – scottd

+0

안녕하세요. 한 대의 컴퓨터에있는 모든 앱 서버. 다음은 CSS 캐시 라인의 예입니다 :'% = stylesheet_link_tag 'reset', 'global', 'admins', 'autocomplete', 'dates_input', 'tablesorter', 'partners', 'jqmodal' > 'screen', : cache => set_asset_cache (: admins) %>'우리는 관리자, 구매자, 판매자, 방문 페이지 등을 위해 별도의 레이아웃을 사용합니다 (레이아웃 당 하나). 감사! –

답변

3

AssetHat 보석은이 정확한 문제를 해결합니다. 페이지를 처음로드 할 때 애셋을 연결하는 대신 (페이지의 로딩 시간이 길어짐) 배치 대신에 애셋을 연결합니다. 보너스로 보석은 CSS와 JS를 축소하여 소중한 바이트를 절약합니다.

는 설치 후 사용이 매우 간단하다 :

  • 사용 include_css :bundle => 'admins' 및 레이아웃에 include_js :bundle => 'admins'. 번들 내용은 레이아웃을 경량으로 유지하기 위해 구성 파일에 설정됩니다.
  • 배포 스크립트에 rake asset_hat:minify을 추가하십시오. 우리 회사는 약 1 년 동안 카프리 스트라 노 (Capistrano)에서 프로덕션에 사용하고 있습니다.

readmedocs에 대한 추가 정보는, 그리고 나는 질문/아이디어를 듣고 드리겠습니다!

1

당신은 예 (shamelessly reposted)로, wget과를 사용하여 배포 중에 캐시를 따뜻하게 시도 할 수 있습니다 : 당신이 당신의 새로운 전개에 심볼릭 링크를 전환 한 후

wget -r -nd --delete-after http://whatever.com/~popular/page/ 

그러나이 실행되어야 할 것이다. 어쩌면 좀 더 세련된 해결책은 배포에서 자산 캐싱 메소드를 수동으로 호출하는 것일 수 있지만, 그럴 가능성은 확실하지 않습니다. Here's where the caching is performed in Rails :

# File vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb, line  273 
273:  def javascript_include_tag(*sources) 
274:   options = sources.extract_options!.stringify_keys 
275:   concat = options.delete("concat") 
276:   cache = concat || options.delete("cache") 
277:   recursive = options.delete("recursive") 
278: 
279:   if concat || (ActionController::Base.perform_caching && cache) 
280:   joined_javascript_name = (cache == true ? "all" : cache) + ".js" 
281:   joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? ASSETS_DIR : JAVASCRIPTS_DIR, joined_javascript_name) 
282: 
283:   unless ActionController::Base.perform_caching && File.exists?(joined_javascript_path) 
284:    write_asset_file_contents(joined_javascript_path, compute_javascript_paths(sources, recursive)) 
285:   end 
286:   javascript_src_tag(joined_javascript_name, options) 
287:   else 
288:   expand_javascript_sources(sources, recursive).collect { |source| javascript_src_tag(source, options) }.join("\n") 
289:   end 
290:  end 

당신은 캐싱 코드를 수정하고 배포에 수동으로 실행할 수 있습니다.

+0

일부 자산 캐시는 관리자, 구매자, 판매자 등의 로그인 페이지에만 생성되기 때문에 wget이 작동 할 수 있으므로 간단한 wget으로 로그인 할 수 있다고는 생각하지 않습니다. write_asset_file_contents 메소드는 유망 해 보입니다. 누군가가 카피 스트라노에서 일하는 것이 있다면 재미있을 것입니다. –

관련 문제