2012-08-15 59 views
1

我有一個將作爲戰爭部署的Rails(3.1.3帶資產管道)應用程序。這個應用程序有ui「主題」。在內部,我只在Rails應用程序的資產目錄中有.scss文件(Sass),我讓用戶在它們之間切換。Rails - 部署戰爭後添加資產和語言文件

我想允許它已被部署爲戰後管理員主題(主要.scss文件)添加到應用程序。我怎樣才能讓功能不需要戰爭重建/重新編譯(使用鳴鳥)。理想情況下,他們可以添加主題而無需對戰爭文件進行任何操作。

我對語言文件有類似的關注。某人如何動態地將語言文件添加到已部署的Rails應用程序中?

我目前預編譯的資產,即用無禮的話,在生產中寫的主題,但我願意改變這個是否會有助於解決這個問題。我可以在戰爭之外預編譯保護嗎?是否有可能將資產管道的路徑設置在戰爭之外?

回答

1

免責聲明擔任新的主題和語言:我不熟悉戰爭的。我的答案可能完全錯誤,因爲我沒有經驗。請理解,我發現這是一個有趣的挑戰,我想找到一個解決方案。

如果當你創建一個WAR歸檔哪些應用程序能夠做到的事情,我不能告訴。結果我決定用命令行來做實際的編譯。但是,包含sass gem應該不太難,如果需要的話直接使用編譯器。

因爲我靠在命令行上,你必須安裝sass gem。然後使用命令行界面查看README

爲了測試,我創建了一個名爲Theme有以下的列模型。您可能需要更改下面的代碼以符合您的模型。

  1. (string) title # the title of the theme
  2. (string) stylesheet_file_name # the name of the file that is saved

在我的形式我用不同的字段名,以避免重疊。

<%= f.form_field :styleheet %> 

然後在我的控制器中,我添加了代碼來編譯上傳的scss文件並將其移動到公共目錄中。

def create 
    if params[:theme].has_key?(:stylesheet) 

    # create a filename friendly version of the theme name 
    file_name = params[:theme][:stylesheet_file_name] = params[:theme][:title].parameterize 

    # where to copy the temporary uploaded file to. It is important that we get 
    # the original extension. The `sass` command uses the extension to determine how to compile the file 
    tmp_file = "#{Rails.root}/tmp/#{params[:theme][:stylesheet].original_filename}" 

    # move from /tmp path to within the Rails temp directory 
    `cp #{params[:theme][:stylesheet].tempfile.path} #{tmp_file}` 

    # create the theme's css file. 
    File.open("#{Rails.root}/public/stylesheets/#{file_name}.css", 'w') do |f| 

     # compile the .scss file via command line 
     parsed_theme = `sass #{tmp_file}` 

     # store the contents of the file 
     f.write(parsed_theme) 
    end 

    # remove the temporary file we created earlier 
    `rm #{tmp_file}` 

    # this key wasn't part of my AR model 
    params[:theme].delete("stylesheet") 
    end 

    # rest of action here ... 
end 

一旦你有了到位的CSS文件,你可以將其包含在你的layout/application.html.erb文件有以下幾點。

<head> 
    <%= stylesheet_link_tag "/stylesheets/#{@current_theme.stylesheet_file_name}" %> 
</head> 
+0

有趣,我會試試這個在星期一。 – Oleksi 2012-08-25 04:28:40

1

這就是我想到的。

您必須使用一些Apache Tomcat的-httpd的組合

我sugesstion是預編譯的文件,並讓Apache處理靜態內容,不將其添加到戰爭。

,一旦你覺得文件的內容需要改變,再以最新的內容預編譯和更換服務器上。它不應該要求的戰爭將重新部署

你需要做一些服務器配置爲來自Apache的靜態內容,並讓其他電話將轉到tomcat的。

Precomplie資產複製的公共資產目錄,並存儲在別的地方,並從該目錄配置Apache服務器的所有/assets

檢查如何配置mod_jk從Apache靜態資產

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 檢查配置Apache以提供靜態Web應用程序文件

使用proxypass

https://serverfault.com/questions/379667/apache-proxypass-ignore-static-files

https://serverfault.com/questions/156391/what-is-an-ideal-apache-tomcat-setup-with-apache-serving-static-assets

https://www.apachelounge.com/viewtopic.php?t=3907

關於語言文件,如果他們居住以外的資產,那麼我想作爲@pito建議嘗試使用一些數據庫

,或者可以使用相同的緩存技術通過從一些其他服務器調用它並重新載入文件緩存如果該文件需要通過一些管理更新緩存整個文件。

任何代碼更改都需要重新編譯。

您可以直接添加文件更改WEPAPPS文件提取的目錄戰爭被提取並重新啓動Tomcat之後,但我認爲這是對生產環境的風險太大。

我沒有做過,但我覺得肯定是應該工作。

+0

我該如何爲戰爭前的預編譯資產提供服務?我可以從戰爭中的代碼訪問這些內容嗎? – Oleksi 2012-08-19 05:04:38

+0

@Oleksi,您可以使用前端服務器Apache來寫一些規則,只有通過調用其他不是靜態的資產到Tomcat或通過其自助服務,我已經加入回答 – PriteshJ 2012-08-24 06:16:30

+0

我沒有使用Rails應用程序WAR文件的鏈接,但我一直在研究Tomcat上的Java應用程序。我爲我的開發環境設置了一個構建任務,該任務僅將JavaScript,css和xsl文件複製到Tomcat在部署時提取戰爭文件的路徑。您應該可以執行類似的操作來部署預編譯的資源。但是,如果您確實希望用戶能夠在資產集之間切換,我傾向於按照Pito的建議從其他主機或數據庫提供服務。 – Catharz 2012-08-24 07:38:35

1

閱讀有關鶯好像沒有簡單的解決方法,已經應用通過數據庫