2012-08-06 98 views
4

爲什麼不能正常工作?HAML中動態生成的Javascript

:javascript 
    -[1,2,3].each do |number| 
     $("#form_#{number}").my_method(); 

Rails給我一個錯誤,說變量number沒有定義。

回答

4

過濾器的內容不被解釋爲Haml的。您可以使用#{...}進行插值,這就是爲什麼您會看到錯誤 - 篩選器會在"#form_#{number}"中看到#{number},但上面的number定義的行只是原樣傳遞,不會被視爲Ruby,因此遠至就Ruby而言,number仍未定義。

在這種情況下,你可以這樣做:

:javascript 
    #{[1,2,3].map do |number| 
     "$(\"#form_#{number}\").my_method();" 
    end.join("\n")} 

雖然這是一個有點笨拙。

一個清晰的解決方案可能是創建一個輔助方法來創建JavaScript中,你可以從過濾來電:

def create_js(arr) 
    arr.map do |number| 
     "$(\"#form_#{number}\").my_method();" 
    end.join("\n") 
end 

和Haml的是

:javascript 
    #{create_js([1,2,3])} 
+0

感謝您的好解釋!除非我無法獲得'.join(「\ n」)'在ruby 1.9.3上工作的技巧(上面的函數只返回'arr'的內容) – bevanb 2012-08-06 04:03:46

+0

@bevanb note I chang編輯'each'到'map'以及添加'join';你也改變了嗎?否則,你看到了什麼? (我使用1.9.3,它適用於我)。 – matt 2012-08-06 04:07:35

+0

啊,我錯過了從'each'到'map'的改變,謝謝指出。 – bevanb 2012-08-06 04:18:07

0

你有JavaScript內的ruby語法,這顯然不會工作。您可以使用像underscore.js這樣的庫並像這樣迭代你的數組:

_.each([1, 2, 3], function(number){ 
    $("#form_" + number).my_method(); 
}); 

試試看。

或者你也可以使用jQuery的每個:

$.each([1, 2, 3], function(i, number){ 
    $("#form_" + number).my_method(); 
}); 
+0

或者,如果' $()'表示jQuery,'$ .each([1,2,3],函數(i,數字){...' – nnnnnn 2012-08-06 03:30:59