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

Posted

技术标签:

【中文标题】Rails 3 升级:使用数组作为参数从 js.erb 调用 javascript 函数【英文标题】:Rails 3 upgrade : Call javascript function from js.erb with an array as parameter 【发布时间】:2016-05-27 09:34:50 【问题描述】:

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

我在 public/javascripts/application.js 中定义了一个 javascript 函数 js_avancements(当我切换到资产管道模式时,此函数将移动到另一个 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:对不起我的英文,欢迎指正!

【问题讨论】:

【参考方案1】:

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

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

使用to_jsonto_shtml_safe 来解决此问题。

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

【讨论】:

非常感谢你,这是有效的!我尝试了 to_s 和 to_json 但没有 .html_safe 它不起作用。你能解释一下为什么它可以在我的旧 Rails 2 版本中运行,而在这个版本中不再运行了吗? 这是一篇由 Yehuda Katz yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0 创作的文章

以上是关于Rails 3 升级:使用数组作为参数从 js.erb 调用 javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何将 id 数组作为隐藏字段的参数传递?

Rails 4.0.0到4.1.0升级会导致错误的参数错误

require_tree 参数必须是 Rails 5 升级应用程序中的目录

Rails 将 3.2.* 升级到 4 不在 Rails 控制台中显示所有用户属性

Rails 4.2 - url helper 引发“ArgumentError:错误数量的参数(3 for 1..2)”

Rails 3.0.20 应用程序上的 Ruby 升级(从 1.8.7 开始)导致时区异常