2012-07-11 37 views
3

我不太瞭解helpers如何在視圖/控制器中工作。我從未使用過它們。如何在coffeescript中使用Rails助手js

我的具體問題是:幾乎所有的視圖都實現了AJAX。在大多數我的控制器,所述update.js.coffeecreate.js.coffee具有某種形式的以下代碼的:

jQuery -> 
    <% if @product.errors.any? %> 
    error_info = '<%= j(render :partial => "shared/errors", :locals => { :record => @product }) %>' 
    popup error_info 

    <% else %> 
. 
. 
. 

其中popup是Javascript函數來顯示一些元件。

有沒有辦法將這個抽象成一個幫手?做這個的最好方式是什麼?這個代碼在每種情況下幾乎完全相同,除了@product的兩個用途當然會根據所討論的模型而不同。

如果這不是輔助工具的用途,那麼1)它們用於什麼?和2)我應該用什麼來代替?

編輯:紅利問題:實際上,我的許多新建,創建,編輯和更新功能在各個模型中是相似的。你如何幹這件事?或者你只是不擔心呢?

回答

0

如果您想將此代碼重構爲一個rails helper,它將像其他任何helper方法一樣完成,您必須將所有javascript代碼作爲字符串來使用,並且您的rails helper需要返回一個字符串。

Rails助手可以幫助重構邏輯超出視圖範圍,這樣您就可以儘可能減少邏輯代碼的數量,並且允許重複代碼更幹。

如果您發現某些代碼正在您的模型中重複使用,您還可以考慮將該代碼重構爲lib目錄中的ruby模塊,並將該模塊包含到模型中。

+0

感謝您的信息。助手返回的字符串是javascript,帶有erb,對嗎?既然是咖啡,返回的字符串是否需要換行符和雙倍間距縮進才能正常工作? – Bryan 2012-07-11 05:52:55

3

第一步是將文件的擴展名更改爲.js.coffee.erb。這讓資產管道知道你想要用ERB解釋文件。

第二步,可選步驟是向Sprokets添加自定義助手,以便您可以從Coffee腳本文件*中調用自己的方法。只需創建一個新的輔助模塊,然後在初始化註冊它:

Sprockets::Context.send :include, CoffeeHelper 

*:資產將無法訪問您習慣使用,因爲該局正在運行的所有助手當資產被編譯,而而不是作爲HTTP請求的一部分。正常的控制器/幫助器設置不存在。