Rails 3 升级:从 js.erb 调用 javascript 函数,使用数组作为参数

Rails 3 upgrade : Call javascript function from js.erb with an array as parameter

本文关键字:数组 参数 函数 javascript 升级 js 调用 erb Rails      更新时间:2023-09-26

升级一个旧的Rails应用程序,我想从原型切换到Jquery,使用不显眼的javascript。

我有一个在 public/javascripts/应用程序中定义js_avancements javascript 函数.js(当我切换到资产管道模式时,这个函数将移动到另一个 js 文件(。

function js_avancements (nb_bars, bars_values, bars_names) {
    // test code
    alert(nb_bars);
    for (var i=0; i<nb_bars; i++) {
        alert(bars_names[i] + " : " + bars_values[i].toString());
    }
}

我在控制器中的旧功能(Rails 2/原型(是

def avancements
  # Here I get values from DB
  # nb_bars = integer
  # bar_values = array of integers
  # bar_names = array of strings
  render :update do |page|
    page.replace_html "menu_avancement", :partial => "menu_avancement"
    page.replace_html "show_avancement", :partial => "show_avancement_clean"
    page.call 'js_avancements', nb_bars, bar_values, bar_names
  end
end

新版本(Rails 3/JQuery(
在控制器中:

def avancements
  # Here I get values from DB
  # @nb_bars = integer
  # @bar_values = array of integers
  # @bar_names = array of strings
  # Values for test
  @nb_bars = 4
  @bars_values = [10,17,12,8]
  @bars_names = ['Aaa', 'Bbb', 'Ccc', 'Ddd']
  respond_to do |format|
    format.js { render "update_avancements" }
  end
end

我的观点 (update_avancements.js.erb(

$('#menu_avancement').html('<%= escape_javascript(render(:partial => 'menu_avancement')) %>');
$('#show_avancement').html('<%= escape_javascript(render(:partial => 'show_avancement_clean')) %>');
$(document).ready(function() {
  js_avancements(<%=@nb_bars%>, <%=@bars_values%>, <%=@bars_names%>);
});

我无法从javascript函数中的数组(bar_values和bar_names(中获取值。如果我仅使用整数或字符串参数调用我的 javascript 函数,则一切正常,但数组没有任何反应。

我做错了什么?感谢您的帮助。

PS :对不起我的英语,欢迎您指正!

最后一个论点是最有可能给你带来问题的原因。 我打赌 js 响应看起来像

js_avancements(4, [10,17,12,8], [&quotAaa&quot, &quotBbb&quot, &quotCcc&quot, &quotDdd&quot])

使用to_jsonto_s html_safe来解决此问题。

js_avancements(<%= @nb_bars.to_s.html_safe %>, <%= @bars_values.to_s.html_safe %>, <%= @bars_names.to_s.html_safe %>);