将多个rails变量传递给javascript

ali*_*lik 7 javascript ruby-on-rails rjs ruby-on-rails-3 ruby-on-rails-3.1

我在ruby(变量和对象/哈希)中有一些值,我想在渲染页面上传递给javascript.目前我使用这些方法简单地编写在客户端声明变量的javascript.

  def declare_as_js_vars vars
    string = ""
    vars.each do |name, value|
      string += self.declare_as_js_var(name, value)
    end
    string
  end

  def declare_as_js_var name, value
    name.to_s + "='" + value.to_s + "';"
  end
Run Code Online (Sandbox Code Playgroud)

这里的问题是我无法声明对象,并且必须单独声明变量.我想知道是否有一些方法可以轻松地做到这一点,因为这是一个非常黑客.

我应该如何将变量和对象传递给javascript?请提供一些语法示例

Jar*_*aro 10

这有点晚了但也许它会帮助其他人.有一个很棒的宝石叫做gon,它非常适用于将变量从rails传递给javascript.您也可以发送整个对象.

在控制器中你可以有这样的东西

@your_int = 123
@your_array = [1,2]
@your_hash = {'a' => 1, 'b' => 2}
gon.your_int = @your_int
gon.your_other_int = 345 + gon.your_int
gon.your_array = @your_array
gon.your_array << gon.your_int
gon.your_hash = @your_hash
gon.your_object = Table.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

然后在javascript中它将可用

alert(gon.your_int)
alert(gon.your_other_int)
alert(gon.your_array)
alert(gon.your_hash)
alert(gon.your_object.name)
Run Code Online (Sandbox Code Playgroud)

还有关于它的railscast.


blo*_*ilk 9

我喜欢使用JSON类型的脚本标签来完成工作.它避免了污染全局命名空间,Rails恰好支持将对象序列化为JSON.

你可以在你看来使用这样的东西:

<script id="my_vars_json" type="text/json">
    <%= @my_vars.to_json %>
</script>
Run Code Online (Sandbox Code Playgroud)

然后由你来解析使用JavaScript的JSON.我喜欢使用jQuery:

$(function () {

    var myVarsJSON = $("#my_vars_json").html(),
        myVars     = $.parseJSON(myVarsJSON);

    console.log(myVars);

});
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 当`@ my_vars`表示来自数据库的多个entires时(例如,控制器中的@my_vars = MyVar.all,其中MyVar是模型),我遇到了这种方法的问题.使用`<%= raw @ my_vars.to_json%>`解决了这个问题.谢谢你的回答,这很有帮助! (2认同)

Bvu*_*Ic7 0

也许你应该尝试使用objects.to_json;)