我在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中是否有一些方法可以轻松地做到这一点,因为这被证明是相当的hack。
我应该如何传递变量和对象到javascript?请提供一些语法示例
这有点晚了,但也许它会帮助其他人。有一个很好的宝石叫做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)
还有一个关于它的广播。
我喜欢使用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);
});
希望有帮助!
我需要从数据库中获取用户的名字,并将值以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 %>
我认为使用Gon gem将是最好的解决方案。还可以查看这个视频
也许你应该尝试使用对象。to_json;)
我发现了gem客户端变量,它看起来很有希望。您的配置和变量传递给客户端,您可以轻松地在客户端
看看这个
http://tech.thereq.com/post/17243732577/rails-3-using-link-to-remote-true-with-jquery-ujs 最简单的方法之一是使用js。您可以在其中使用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
/视图/项目/action.js.erb
$(div).html('The cat has erased your page');