在HAML中动态生成的Javascript

Dynamically-generated Javascript within HAML

本文关键字:Javascript 动态 HAML      更新时间:2023-09-26

为什么不起作用?

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

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

过滤器的内容不会被解释为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])}

您的javascript中有ruby语法,这显然是行不通的。您可以使用underscore.js这样的库,并像这样迭代您的数组:

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

试试看。

或者你可以使用jQuery的each:

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