我正在使用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语句的字符串。有任何想法吗?提前谢谢!
答案 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"];
});