2013-02-26 98 views
1

我有一個腳本,基本上是用戶嵌入的「小部件」。直接鏈接到資產管道中的編譯資源?

它只是簡單的香草JavaScript,並沒有任何要求的其他資源。它位於/app/assets/javascripts/delivery.js

我想要做的是讓文件得到壓縮/編譯,然後讓用戶從腳本標記直接鏈接到它,即。 <script src="http://example.com/assets/delivery.js"></script>

但現在......這是一個不行。該文件在生產中不存在。

那麼,我怎樣才能像管道中的任何其他JS文件一樣壓縮該文件,然後直接鏈接到它?

+0

這是什麼'link'?您的描述幾乎是[asset-pipeline]的默認功能(http://guides.rubyonrails.org/asset_pipeline.html)。 – 2013-02-26 18:29:29

+0

這將是'http:// example.com/assets/delivery.js'。我在'/ app/assets/javascripts/delivery.js'中存在'delivery.js',我希望能夠鏈接到'/ assets/delivery.js'的生產環境中,但是現在當我這樣做時,我收到「找不到頁面」錯誤。 – Shpigford 2013-02-26 20:41:56

+0

我建議將它放在'public /'中(假設它將處於生產模式)。 – 2013-02-26 22:46:55

回答

3

如果添加

config.assets.precompile += ['delivery.js'] 

您application.rb中,然後delivery.js將被視爲一個清單文件:它會被預編譯,並擔任了在生產delivery.js。清單文件通常只是一系列//= require(或//= require_directory)語句,但它們包含的任何JavaScript也將被添加到生成的文件中。

默認情況下,application.js清單包含了所有內容 - 您想要調整此設置,以便它不包含僅用於單獨服務的JavaScript。

+0

我愛你。這已經躲過了我好幾天。你贏了。 :) – Shpigford 2013-02-28 16:05:09

0

首先,確保您的app/assets/javascripts/delivery.js不在您的頂級「清單」JavaScript文件中,即app/assets/javascripts/application.js。 application.js通常包含//= require_tree .,所以它默認包含你的delivery.js。你需要改變它。將「require_tree」替換爲您希望在application.js中進行預編譯和組合的所有資產的單個「require」語句。

接下來,更新你的環境文件(生產ENV配置/環境/ production.rb),包括在預編譯的資產清單文件:

config.assets.precompile += %w(delivery.js) 

現在,你把它作爲一個單獨的文件在公共/資產目錄中,按照application.js的相同方式進行編譯和壓縮。請記住,它有一個類似於你的application.js的附加名稱的摘要(除非你通過設置config.assets.digest = false來提供沒有摘要的文件)。