2017-02-11 28 views
0

我有一個coffescript文件在JavaScript文件夾內,並且在這個文件夾中,rails會自動將它添加到所有視圖中,但是我希望該文件僅用於單個視圖中,因爲如果它是添加到其他視圖你可以改變它們。將coffeescript添加到給定的視圖

+0

[Rails and Page Specific Javascript]的可能重複(http://stackoverflow.com/questions/18724247/rails-and-page-specific-javascript) – Iceman

回答

1

這是一個相對常見的問題,但有幾件事你可以做只在某個頁面上呈現該JavaScript。

的JavaScript模塊模式

使用模塊模式,你會想將多數在匿名關閉你的JavaScript像這樣(在CoffeeScript中):

do -> 
    # ... all vars and functions are in this scope only 
    # still maintains access to all globals 
    return 

代碼封蓋裏面你要執行可以像這樣的對象內部包裝:

(($) -> 
    myObj = myFunc: (param) -> 
    # do stuff ... 
    return 

    $('selector').click -> 
    myObj.myFunc() 
    return 
    return 
) jQuery 

所以要執行被包裝在一個對象的函數中的代碼,然後你可以在事件發生時調用該對象。如果您想在單個視圖中運行的代碼僅依賴於用戶交互,例如點擊,懸停和其他事件,則可以執行此類操作。

身體CSS類

在軌,您可以控制器和動作類添加到你的身體標記。通過這樣做,你可以使用javascript來定位正文的css類,然後根據當前視圖的類來執行一些代碼。它看起來有點像這樣:

在application.html.erb

<body class = "<%= controller_name %> <%= action_name %>" 

比方說,你想執行的CoffeeScript您articles控制器的new動作,然後在CoffeeScript的文件:

if $('body').hasClass('articles') and $('body').hasClass('new') 
    # do stuff for the articles#new 
else 

帕洛瑪寶石

你可以檢查出paloma gem,但我不認爲創業板是活動再維持下去。

我希望有幫助!

+0

謝謝,但它可能會做一些事情,如禁用require_tree並添加帶有「src」的標籤,該標籤指向coffescripts和javascripts的地址,以便在每個文件中手動添加它們,以防整個項目中需要使用某些標籤放置在layaout中以及未放置在各自的意見。可能嗎? – LuisC

+0

是的,這在技術上是可行的,但是這與推薦和首選的導軌方式大相徑庭。這也是一個很大的性能問題,因爲服務器必須在可能的每個視圖上提供不同的資產。如果您仍想這樣做,則必須放棄使用資產管道並手動配置每個視圖以使用特定的JavaScript文件。我會堅持推薦上面的選項2。 – Mark