一旦使用jQuery创建了Rails对象的ID,就获取它

时间:2014-09-11 22:07:00

标签: jquery ruby-on-rails

我试图创建多个名为" 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

1 个答案:

答案 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调用真正的异步 - 只有当他们拥有从服务器返回的数据时才更新。如果您不喜欢

,我可以重新考虑这一点