Rails:将 ajax 成功时收到的 ActiveRecord 作为参数发送到另一个 ajax
Rails: Send ActiveRecord received at ajax success as param to another ajax
情况是这样的:我有一个名为"仪表板"的视图,其中包含一个简单的表单和一个"绘制图形"按钮。当我按下这个按钮时,我想发出两个 ajax 请求,这些请求将返回我的 javascript 构建两个不同图形所需的数据。问题是两个请求都需要在我的数据库上执行完全相同的查询,我想避免重复查询。
我目前这样做的方法是让我的按钮触发一个 ajax 请求,该请求向 mysql 查询必要的数据,将该数据返回到我的 ajax 成功,然后将相同的数据作为参数传递给另外两个 ajax 请求,然后使用这些数据生成绘制图形所需的结构。
它看起来像这样:
Javascript:
$('#draw_graphs').click(function() {
$.ajax({
url: 'single_query',
dataType: 'json',
data: $('#myForm').serialize(),
method: 'get'
}).success(function(activeRecord) {
ajax_graph1(activeRecord);
ajax_graph2(activeRecord);
});
});
ajax_graph1 = function(activeRecord) {
$.ajax({
url: 'create_g1',
dataType: 'json',
data: {active_record: activeRecord},
method: 'post'
}).success(function(g1) {
create_g1(g1);
});
};
ajax_graph2 = function(activeRecord) {
$.ajax({
url: 'create_g2',
dataType: 'json',
data: {active_record: activeRecord},
method: 'post'
}).success(function(g2) {
create_g2(g2);
});
};
导轨:
def single_query
result = Data.where("etc... etc...")
respond_to do |format|
format.json { render json: result.to_json }
end
end
def create_g1
activerecord = params[:active_record]
graph1 = {}
activerecord.each do |ar|
#do whatever with graph1
end
respond_to do |format|
format.json { render json: graph1.to_json }
end
end
def create_g2
activerecord = params[:active_record]
graph2 = {}
activerecord.each do |ar|
#do whatever with graph2
end
respond_to do |format|
format.json { render json: graph1.to_json }
end
end
我遇到的问题是,显然你不能简单地将活动记录从控制器发送到javascript,然后再发送回控制器,结构似乎在途中发生了变化。虽然single_query
的result
是类ActiveRecord_Relation
,但当我通过"javascript层"传递它时,它会转换为ActionController::Parameters
类
你的推理是有道理的:只想点击一次数据库。问题是理解"javascript层"如何与Rails一起工作。AJAX 调用正在获取表示为 JSON 的 XHR 响应对象。这映射到 Rails 中active_record
的表示形式,但它肯定不是 JS 中对象的相同实例。
话虽如此,你应该在 Rails 端对记录做你需要做的事情,只需将响应发送到一个 AJAX 调用。在这种情况下,请让$('#draw_graphs').click(
AJAX 调用以相应的def draw_graphs
方法命中控制器。让该方法执行数据库调用,构建每个图形,并在 JSON 哈希中将两个图形传递回(如下所示)。然后在.success(function(graphs)
上解析响应并将结果发送到 2 个ajax_graph
方法。
生成 JSON 哈希format.json { render json: { graph1.to_json, graph2.to_json } }
这里也有一些设计优化。您希望有一个瘦控制器,因此请考虑仅使用控制器来清理/允许任何参数进入result = Data.where(...)
。将这些参数传递给执行查询的类中的方法,并且可能具有用于生成图形的帮助程序方法。看起来您甚至可以根据它正在构建的图形在该帮助程序方法中执行 case 语句,因为create_g1
和create_g2
代码看起来相似。同样,您也可以在JS中重构代码。
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- Ajax.ActionLink-传递javascript参数
- 原型Ajax请求参数为嵌套json
- 如何在所有ajax调用中向URL添加参数
- XMLHttpRequest.open()AJAX中的参数url
- 使用AJAX POST从javascript到带有Strong参数的Rails4控制器
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- Ajax中参数后缺少括号
- ajax post在webapi中传递null参数
- 如何参数化ajax TruClient脚本中的值
- 聚合物-Prolems成功发送核心ajax参数
- 序列化的 Ajax 参数未显示在 PHP 中
- 如何通过角度服务器路由发送 Ajax 参数
- 谷歌地理位置没有采取所有ajax参数作为地址
- 根据输入值更改 AJAX 参数
- 向 ajax 参数添加循环
- 通过数组作为$ajax参数MVC
- Grails: Ajax参数没有到达控制器
- 在流程图中传递ajax参数
- 我需要获取asp.net文件上传到Ajax参数的值