我在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?请提供一些语法示例
答案 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
变量,该变量从用户表中获取id
和firstname
属性,
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');