在javascript中访问Ruby对象

时间:2016-02-03 10:43:14

标签: 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 = "<%= j @user.email %>";
    // do stuff with myEmail
<% end %>

我的问题是,有没有一种方法可以在维护用户数据时呈现此javascript或将其包含在单独的脚本标记中?我不想在这个javascript_tag中编写数百行jQuery和js,调试很痛苦。到目前为止我尝试的所有东西(将它放在资产管道中,渲染一个单独的.js.erb文件)只是将myEmail变成一个包含ruby语句的字符串。有任何想法吗?提前谢谢!

3 个答案:

答案 0 :(得分:4)

03-02-2016 21:10:好的,得到一个有效的例子 - Dibbz到Sergio Tulentsev - 他是对的,在调用.to_json时,甚至不需要解析为有效的JSON ruby对象它将打印一个有效的JS对象文字。 这是带有工作示例的github repo,如果你想克隆它并使用代码 - 请随意,祝你有愉快的一天! (示例使用Rails构建)

除了ØleBjarnstroem的回答暗示使用AJAX,如果你想在JS中使用模型,你可以做这样的事情

<% javascript_tag do %>
    var user = <%= @user.to_json %>;
<% end %>

现在JS变量user包含了模型所具有的所有属性,因为它只是将ruby对象直接转换为JSON 直接转换为JS对象。

修改

至于不必编写JS,你可以为它创建一个帮助器 - 这仍然会将JS注入你的页面,但是你可以只提供一个对象作为这个函数的参数,然后只需在你的代码中输出它使用1次调用而不是执行javascript_tag do ... end构造。

有多种方法可以解决这个问题,您可以使用Rails'content_for设置并获取将在您头脑中呈现的内容。

e.g。

<强>辅助

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

将在一行上呈现相同的输出,第一个参数(在这种情况下为'user')是变量将具有的名称,第二个参数(@user)将转换为JSON。

但请稍等...... 如果我想在文档的<head>中找到它?

好吧,帮助器有一个可选的第三个参数,如果提供它将返回content_for的值,它将在内容中设置标记。

因此,如果您在 layout.erb 中有类似

的内容

<强>布局

<head>
   <!-- ... snipped -->
   <%= content_for :javascript if content_for? :javascript %>
</head>

您可以在视图中使用以下内容(请注意,我们不会使用<%=呈现任何内容,而是使用<%,因为我们正在保存要在<head>中使用的内容)

<% obj_as_js_var('user', @user, :javascript) %>

现在,布局头部的content_for :javascript将始终在那里呈现输出。请注意,如果在 application.js 之后>加载了content_for :javascript,那么您将无法获得数据!

答案 1 :(得分:1)

var user = <%= @user.to_json.html_safe %>;

答案 2 :(得分:0)

为什么不通过简单的REST API提供所需的数据,只需使用jQuery请求它,然后根据需要处理结果?

在您的控制器中,GET /users/:id/

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

在jQuery中:

$.getJSON( "/users/1", function( data ) {
  // Do something with the retrieved data
  console.log(data);
  var myEmail = data["email"];
});

另见Building a RESTful API in a Rails Application