将多个rails变量传递给javascript

时间:2011-11-25 01:09:40

标签: javascript ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 rjs

我在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

这里的问题是我无法声明对象,并且必须单独声明变量。我想知道在rails中是否有某种方法可以轻松实现这一点,因为这种情况非常糟糕。

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

7 个答案:

答案 0 :(得分: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])

然后在javascript中它将像

一样可用
alert(gon.your_int)
alert(gon.your_other_int)
alert(gon.your_array)
alert(gon.your_hash)
alert(gon.your_object.name)

还有一个railscast

答案 1 :(得分:8)

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

您可以在视图中使用以下内容:

<script id="my_vars_json" type="text/json">
    <%= @my_vars.to_json %>
</script>

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

$(function () {

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

    console.log(myVars);

});

希望有所帮助!

答案 2 :(得分:2)

我需要从数据库中获取用户的名字,并将值传递给JSON格式的javascript变量。

然后我声明了一个名为token的ruby变量,该变量从用户表中获取idfirstname属性,

  ActiveRecord::Base.include_root_in_json = false

  @token = User.all.to_json(only: [:id, :firstname])

erb文件中,我使用了以下行

var tokenList = <%= @token.html_safe %>

答案 3 :(得分:1)

我认为使用Gon gem将是最佳解决方案。 另请查看此video casts

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我发现了宝石client variable,看起来很有前途。您的配置和变量将传递给客户端,您可以轻松获取或设置客户端

答案 6 :(得分:0)

看看这个。

http://tech.thereq.com/post/17243732577/rails-3-using-link-to-remote-true-with-jquery-ujs

最简单的方法之一是使用js.erb文件,您可以在其中执行ruby标记来访问您在控制器操作中定义的变量。

您需要在控制器操作中使用respond_to块,指定能够响应javascript的操作。

<强> items_controller.rb

class ItemsController < ApplicationController

  def action
    respond_to do |format|
      format.js
      #format.html {}    #  These are for allowing other types of formats to be responded to.
      #format.json {}    #  But they are not necessary for using this js.erb way of doing things.
    end
  end

end

<强> /views/items/action.js.erb

$(div).html('The cat has erased your page');