2012-08-31 91 views
3

最近我一直在思考CoffeeScript,並且我剛剛升級了一個Rails項目,我一直致力於Rails 3.2.8(來自Rails 3.0.9,它沒有資產管道)在this guide之後。如何用軌道咖啡腳本開發

我不得不做一些hackish的東西來讓事情正常工作。我測試了一個新頁面'/ pages/game',因此它在資產目錄中有一些CoffeeScript示例。

(應用程序/資產/ Java腳本/ page.js.coffee)

class MyObject 
    constructor: -> 
    hello: -> alert 'hello world of coffeescript!' 


a = new MyObject 

a.hello() 

然後,我添加了一行到我的生產環境: (配置/環境/ production.rb)

config.assets.precompile += %w(pages.js) # this is needed to precompile coffee script files... it is difficult to understand how manifest files work... 

然後鍵入

$ bundle exec rake assets:precompile 

一起彙編page.js唯一的問題是類I C用CoffeeScript處理並不能像我預期的那樣工作。所以我在FireFox中打開了我的開發者控制檯,並嘗試手動實例化類,但它表現爲沒有名爲MyClass的對象。

那麼我哪裏出錯了?假設我可以手動實例化我在CoffeeScript中編寫的類嗎?我的hackish是否將pages.js添加到預編譯數組不合適?如果您是CoffeeScript專業人員,您會如何測試您的課程等?

更新: 我的問題的一部分是'可變隱私',是在咖啡腳本類inherant。這個隱私可以用標準的JavaScript來實現,並且在涉及咖啡腳本之前應該被理解。 http://benalman.com/news/2010/11/immediately-invoked-function-expression/

這就是說,需要被附加到窗口對象的咖啡腳本類,使之全局,就像這樣:

更正

class MyObject 
    constructor: -> 
    hello: -> alert 'hello world of coffeescript!' 


window.MyObject = MyObject; 

一旦類是在此發表莊園(通過將其附加到窗口作爲一個全局),它可以通過a = new MyObject()實例化,然後通過其功能正常地提醒屏幕a.hello()

+0

請記住,堆棧溢出像維基百科一樣,主要是爲了提供參考。你寫作的語氣應該很專業。 – meagar

+0

您不應該將'pages.js'添加到預編譯的資產中。相反,你應該通過'// = require pages'將它添加到你的JS清單文件中。簡單地將其添加到預編譯的資源中並不包含在您的頁面中。 – meagar

回答

4

MyObject絕對存在如果您將pages.js的內容加入您的頁面。您可能需要添加

<%= javascript_include_tag "pages" %> 

到HTML或設置

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

,而是添加一定被包含在application.js以下到app/assets/javascripts/application.js.coffee

//= require pages 

,使您的app/views/layouts/application.html.erb

<%= javascript_include_tag "application" %> 

Rails Guide對資產管道是相當有幫助的。雖然...

Rails希望您(默認情況下)在部署到生產時將所有javascript打包到一個application.js文件中。鏈輪可用於添加require指令,以找到,包含和編譯application.js文件中列出的文件。

默認情況下Rails會只編譯application.jsapplication.css和任何非.js/.css文件中app/assetslib/assetsvendor/assets。這意味着,除非您將pages.js//= require指令添加到application.js文件中,否則Rails將忽略它。

這就是爲什麼您試圖將pages.js添加到config.assets.precompile編譯的文件列表。這告訴Rails明確編譯該文件,使其可以通過一個javascript包括像

<%= javascript_include_tag "pages" %> 

這我假設你沒有把你的HTML。走這條路線通常不是因爲幾個原因,其中之一就是通過這樣做,您對Rails試圖向您提供資產管道//= require行的幫助表示「不感謝」。

所以,任何一種方法都是可行的;您尚未完成必要的步驟以獲取pages.js的內容,這就是爲什麼MyObject不存在的原因。

+0

感謝您的回覆。我通過<%= javascript_include_tag「pages」%>方法確實有一些工作正常。唯一的問題是,我的javascript代碼看起來像這個http://pastebin.com/HZG6bzfp ,它似乎正在運行兩次,因爲我看到了兩次警報消息。 – Ninjaxor

+0

好吧,我回到它,清理了一堆pages.js緩存文件,並且警報消息只出現一次。我還通過在我的咖啡腳本文件中執行'window.MyObject = MyObject'來將該類附加到窗口上,因爲這似乎是您如何聲明允許我使用控制檯進行調試的公共類,就像我一直使用直線JavaScript項目一樣。非常感謝幫助我使CoffeeScript脫離實際。 – Ninjaxor

+0

@deefour嗨 - 這是否適用於導軌4? – BKSpurgeon