在javascript中访问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语句的字符串.有任何想法吗?提前致谢!

解决方法:

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

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

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

现在JS变量用户拥有模型所具有的所有属性,因为它只是将ruby对象直接转换为JSON直接转换为JS对象.

> Rails to_json

编辑

至于不必编写JS,你可以为它创建一个帮助器 – 这仍然会将JS注入你的页面,但是你可以只提供一个对象作为这个函数的参数,然后只需在你的代码中输出1个而不是做javascript_tag做…结束构造.

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

例如

帮手

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,那么您将无法获得数据!

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...