我试图创建多个名为" baseRules"在jQuery中通过调用我的Rails控制器的post请求。嵌套在此对象创建中的是规则的子集,称为" matchTypes",属于主要规则。我需要为该子集分配一个foreign_id,以使其正常工作。有没有办法在jQuery中创建主规则对象的ID?
这是我的Javascript代码:
for (var i = 0; i < baseRules.length; i++) {
$.post('/rule_types', {
name: baseRules[i][0],
matchFlag: baseRules[i][1]
}, function () {
if (baseRules[i][1]) {
for (var k = 0; k < baseRules[i][2].length; k++) {
$.post('/match_types', {
name: matchType[i][2][k],
rule_type_id: ? ? ? ?
}, function () {
});
}
}
});
}
这是我的控制器方法:
class RuleTypesController < ApplicationController
def create
@ruleType = RuleType.new
@ruleType.name = params[:name]
@ruleType.matchFlag = params[:matchFlag]
respond_to do |format|
if @ruleType.save
format.html{redirect_to root_path}
format.js{}
else
format.html{}
format.js{}
end
end
end
end
class MatchTypesController < ApplicationController
def create
@matchType = MatchType.new
@matchType.name = params[:name]
matchType.rule_types_id = params[:rule_type_id]
respond_to do |format|
if @ruleType.save
format.html{redirect_to root_path}
format.js{}
else
format.html{}
format.js{}
end
end
end
end
答案 0 :(得分:1)
关于你的问题(额外的&#34; frills&#34;可以在之后解决),为了接收新创建的对象的id
,你应该能够用ajax:成功请求。
<强>的Ajax 强>
您的流量稍微复杂一些(Ajax is asynchronous),这意味着如果您想使用收到的数据,则可能必须使用ajax回调(并不像听起来那么复杂)
如果您创建新记录,Rails将始终触发响应。在此响应中,您可以访问新创建的记录的id
属性,允许您访问对象的新ID:
for (var i = 0; i < baseRules.length; i++) {
$.post('/rule_types', {
name: baseRules[i][0],
matchFlag: baseRules[i][2]
}, function (data) {
var returnedData = JSON.parse(data);
if (baseRules[i][3]) {
for (var k = 0; k < baseRules[i][2].length; k++) {
$.post('/match_types', {
name: matchType[i][2][k],
rule_type_id: returnedData.id //Calls the original "ID" of the returned post
}, function () {
});
}
}
}, dataType: "json");
}
这将使您能够在控制器中确定JSON响应:
#app/controllers/rules_types_controller.rb
class RuleTypesController < ApplicationController
respond_to :js, :json, :html
def create
@ruleType = RuleType.new
@ruleType.name = params[:name]
@ruleType.matchFlag = params[:matchFlag]
@ruleType.save
respond_with @ruleType
end
end
end
<强>响应强>
虽然我认为您会在我发布的内容方面取得进展,但您希望了解自己如何使用$.post
功能。虽然 现在可以正常工作,但您需要了解如果您尝试使用ajax功能synchronously
,则在请求完成时可能会freeze your UI
解决此问题的方法是使用Ajax回调。我们之前做过这个:
function fetch(link, data, response, type = "script") {
$.post(link, data, response(data), dataType: type);
}
for (var i = 0; i < baseRules.length; i++) {
fetch('/rule_types', {
name: baseRules[i][0],
matchFlag: baseRules[i][2]
}, function (data) {
var returnedData = JSON.parse(data);
if (baseRules[i][3]) {
for (var k = 0; k < baseRules[i][2].length; k++) {
fetch('/match_types', {
name: matchType[i][2][k],
rule_type_id: returnedData.id //Calls the original "ID" of the returned post
});
}
}
}, "json");
}
这个应该使它成为你的ajax调用真正的异步 - 只有当他们拥有从服务器返回的数据时才更新。如果您不喜欢
,我可以重新考虑这一点