2014-03-19 157 views
2

我有一個動態創建和編譯自視資產Rails應用程序的網域,您訪問的網站(讓說不同的顏色,其中的顏色值存儲在數據庫)如何判斷產生新的公共資源文件的Rails資產

讓的說了www.hello.example就會產生public/assets/hello-application-52777d36dec6f6e311560156da9da1c2.css所以瀏覽器的源文件將指向

layout: 
= stylesheet_link_tag 'hello-application' 

generated html: 
<link href="/assets/hello-application-52777d36dec6f6e311560156da9da1c2.css" media="all" rel="stylesheet" /> 

如果添加www.goodbye.example它將編譯public/assets/goodbye-application-52777d36dec6f6e311560156da9da1c2.css所以瀏覽器的源文件將指向

layout: 
= stylesheet_link_tag 'goodbye-application' 

generated html: 
<link data-turbolinks-track="true" href="/assets/goodbye-application-52777d36dec6f6e311560156da9da1c2.css" media="all" rel="stylesheet" /> 

資產都在運行正確編譯而不需要重新啓動服務器。上述做工精細

例子,如果我重新啓動服務器

我想不通的事情是如何告訴新的公共資源文件生成導軌,使其= stylesheet_link_tag 'goodbye-application'將它撿起來,而無需重新啓動生產服務器

我的猜測是,它有事情做,以告訴Rails重新加載public/manifest.json我只是無法弄清楚

  • 的Rails 4.0.2
  • 紅寶石2.1
  • 獨角獸生產服務器

我的功能有點類似,但是krautcomputing article他與「消化」,這是不是爲軌道4,5工作solwing這個問題(+它不久將被取消)


更新

一個紈絝子弟提供一個答案(他不得不刪除)建議我不必這樣做,因爲獨角獸具有零時間重新啓動,這樣我就可以重新啓動麒麟,它將加載新的公共財產......這是真的,我這樣做是這樣,我已經問過這個問題之前。不過,我正在尋找避免這種情況的解決方案。 (讓用戶說產生每天1000款)

他還建議使用咕嚕...嗯,這是B計劃,我真的不知道是否有一種方法在Rails的鏈輪要做到這一點:)

+0

Rails現在如何做到這一點?您現在使用什麼配置來完成即時生成? – phoet

+1

另外:您應該儘快從rails v4.0.2升級到最新的v4.0版本。 [v4.0.3](http://weblog.rubyonrails.org/2014/2/18/Rails_3_2_17_4_0_3_and_4_1_0_beta2_have_been_released /)引入了多個安全補丁。 – fny

+0

根據將要生成的CSS名稱,如何製作'= stylesheet_link_tag'變量''。 例如,再見一個會有goodbye.css,另一個會有你選擇的名字? – 0bserver07

回答

1

爲什麼不推出自己的輔助方法?

def subdomain_application_stylesheet_link_tag(subdomain) 
    if Rails.env.production? 
    # This assumes you've precompiled the spreadsheet into the public directory via sprockets 
    stylesheet_link_tag File.basename(
     Dir.glob("#{Rails.root}/public/assets/#{subdomain}-application-*.css").first 
    ) 
    else 
    # Logic to development stylesheet selection 
    end 
end 
0

以下是清單重裝問題的完整解決方案。由於在原來的職位說明,新的manifest.json你動態生成不會重新加載,除非你完全刷新你的服務器(或殺死的作品,等等)。只是重申:

如果要動態地創建資產「活」,具有明顯 一起以防止緩存,鏈輪不重裝 請求之間的清單。

我需要這種清單重載能力,因爲我正在使用Gulp來滾動自己的資產管道以提高性能。基本上,使用這種解決方案可以讓資產在生產過程中正確運行,同時在使用新清單進行開發時仍能夠重新加載它們......非常漂亮,我希望您發現它適合您的生產需求。

創建文件的配置/初始化/活manifest.rb:

require 'sprockets/rails/helper' 
    module Sprockets 
    module Rails 
     module Helper 
     def asset_digest_path(path, options = {}) 
      # create the new manifest, overriding sprockets' old one 
      if assets_manifest and manifest = Sprockets::Manifest.new(assets, Dir.glob(File.join(assets_manifest.dir, 'manifest-*.json')).first) 
      if digest_path = manifest.assets[path] 
       return digest_path 
      end 
      end 

      if environment = assets_environment 
      if asset = environment[path] 
       return asset.digest_path 
      end 
      end 
     end 
     end 
    end 
    end 

而且,你比歡迎,如果你希望自定義新的清單目錄的更多。 Mine與前一個位置相同,使用不同的名稱,正如您從Dir.glob方法調用中看到的那樣。

相關問題