在javascript中访问Ruby对象

在javascript中访问Ruby对象,javascript,ruby-on-rails,ruby,Javascript,Ruby On Rails,Ruby,我正在开发一个rails应用程序(4.1.8),它在我的show视图中需要大量javascript,我需要一种方法来访问实际js文件中从ActiveRecord返回的数据 下面是一个例子: 我的节目控制员 def show @user = User.find(params[:id]) end 现在,我需要在show javascript中访问这些数据,但这是唯一的方法: 我的观点 <%= javascript_tag do %> var myEmail = "<%

我正在开发一个rails应用程序(4.1.8),它在我的show视图中需要大量javascript,我需要一种方法来访问实际js文件中从ActiveRecord返回的数据

下面是一个例子:

我的节目控制员

def show
  @user = User.find(params[:id])
end
现在,我需要在show javascript中访问这些数据,但这是唯一的方法:

我的观点

<%= javascript_tag do %>
    var myEmail = "<%= j @user.email %>";
    // do stuff with myEmail
<% end %>

var myEmail=“”;
//处理我的邮件

我的问题是,有没有一种方法可以在维护userdata的同时呈现这个javascript或者将它包含在一个单独的脚本标记中?我不想在这个javascript_标记中编写数百行jQuery和js,调试起来很痛苦。到目前为止,我所尝试的一切(将其放入资产管道,呈现一个单独的.js.erb文件)都只是将myEmail转换为一个包含ruby语句的字符串。有什么想法吗?提前谢谢

为什么不通过一个简单的RESTAPI提供所需的数据,然后用jQuery请求它,然后根据需要处理结果呢

在控制器中,对于
GET/users/:id/

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
        render json: @user
    end
end

另请参见03-02-2016 21:10:好的,有一个工作示例-Dibbz to-他是对的,在调用
时,甚至不需要解析到有效的JSON。对于ruby对象,它将打印一个有效的JSON对象文本。下面是一些工作示例,如果您想克隆它并使用代码,请随意使用,祝您度过愉快的一天!(示例使用轨道构建)


除了Øle Bjarnstrem的答案暗示使用AJAX之外,如果您想在JS中使用模型,您可以这样做

<% javascript_tag do %>
    var user = <%= @user.to_json %>;
<% end %>
现在在视图中使用此辅助对象时

查看

<%= obj_as_js_var('user', @user) %>
# ... rest of page
您可以在视图中使用以下内容(注意,我们没有使用
var user=;

我忘了在myEmail声明后添加分号,但它在我的实际代码中。我是否仍然需要在my.js中获取@user.id来构建URL?这完全取决于您尝试执行的操作。这与传统html视图相同。在这里,您还需要知道id,然后才能从da获取用户tabase。所以我不太理解你的问题。最好跳过一个不必要的HTTP调用。这应该会起作用。在处理需要在前端呈现的数据时,我通常采用类似的方法。我知道还有其他几种方法,但这肯定是最简单的方法+1@v1p和一个需要最少努力的since将ruby AR对象转换为视图中可用的JS对象实际上是一个单行程序;)这不是我要问的,我已经在做类似的事情了。(几周前我就遇到了这个问题)我的问题是如何将里面的内容解压缩到一个单独的js文件中,这样就不那么突兀了(同时仍然可以从最初的GET请求访问@user来显示),无需执行往返操作。只需执行
var user=
。它已经是一个JSON字符串,将由JS引擎解析。@SidneyLebrand:你看到我的PR了,我接受了吗?我也在准备和你刚才一样的编辑文章。
module myHelper

    def obj_as_js_var(var_name, obj, content_name = nil)
        output_tag = javascript_tag("var #{var_name} = #{obj.to_json};".html_safe, type: 'text/javascript')
        # if content_name is set, use content_for instead of directly printing the tag inline
        if content_name
            content_for content_name, output_tag
        else
            output_tag
        end
    end
end
<%= obj_as_js_var('user', @user) %>
# ... rest of page
<head>
   <!-- ... snipped -->
   <%= content_for :javascript if content_for? :javascript %>
</head>
<% obj_as_js_var('user', @user, :javascript) %>
var user = <%= @user.to_json.html_safe %>;