2012-08-06 94 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