在HAML中动态生成的Javascript

时间:2012-08-06 03:16:43

标签: javascript ruby haml

为什么这不起作用?

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

Rails给我一个错误,说没有定义变量number

2 个答案:

答案 0 :(得分:6)

过滤器的内容不会被解释为Haml。您可以使用#{...}进行插值,这就是您看到错误的原因 - 过滤器会看到#{number}中的"#form_#{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])}

答案 1 :(得分: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();
});