jjzjj

javascript - 我如何摆脱这个 JS 错误 : TypeError: $(. ..).validate 不是函数

coder 2025-03-01 原文

我正在使用此处答案中提供的 fiddle 中的以下 JS 代码:

How to display messages from jQuery Validate plugin inside of Tooltipster tooltips?

这是 fiddle :http://jsfiddle.net/kyK4G/

错误出现在第36行,也就是:submitHandler: function (form) {//for demo

这是错误:

TypeError: $(...).validate is not a function

submitHandler: function (form) { // for demo

代码:

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>

$(document).ready(function () {

    // initialize tooltipster on text input elements
    $('#myform input[type="text"]').tooltipster({
        trigger: 'custom',
        onlyOne: false,
        position: 'right'
    });

    // initialize validate plugin on the form
    $('#myform').validate({
        errorPlacement: function (error, element) {
            $(element).tooltipster('update', $(error).text());
            $(element).tooltipster('show');
        },
        success: function (label, element) {
            $(element).tooltipster('hide');
        },
        rules: {
            field1: {
                required: true,
                email: true
            },
            field2: {
                required: true,
                minlength: 5
            }
        },
        submitHandler: function (form) { // for demo
            alert('valid form');
            return false;
        }
    });

});

// no CDN - including plugin below
(function (d, f, g, b) {
    var e = "tooltipster",
        c = {
            animation: "fade",
            arrow: true,
            arrowColor: "",
            content: "",
            delay: 200,
            fixedWidth: 0,
            maxWidth: 0,
            functionBefore: function (l, m) {
                m()
            },
            functionReady: function (l, m) {},
            functionAfter: function (l) {},
            icon: "(?)",
            iconDesktop: false,
            iconTouch: false,
            iconTheme: ".tooltipster-icon",
            interactive: false,
            interactiveTolerance: 350,
            offsetX: 0,
            offsetY: 0,
            onlyOne: true,
            position: "top",
            speed: 350,
            timer: 0,
            theme: ".tooltipster-default",
            touchDevices: true,
            trigger: "hover"
        };

    function h(m, l) {
        this.element = m;
        this.options = d.extend({}, c, l);
        this._defaults = c;
        this._name = e;
        this.init()
    }
    function j() {
        return !!("ontouchstart" in f)
    }
    function a() {
        var l = g.body || g.documentElement;
        var n = l.style;
        var o = "transition";
        if (typeof n[o] == "string") {
            return true
        }
        v = ["Moz", "Webkit", "Khtml", "O", "ms"], o = o.charAt(0).toUpperCase() + o.substr(1);
        for (var m = 0; m < v.length; m++) {
            if (typeof n[v[m] + o] == "string") {
                return true
            }
        }
        return false
    }
    var k = true;
    if (!a()) {
        k = false
    }
    h.prototype = {
        init: function () {
            var r = d(this.element);
            var n = this;
            var q = true;
            if ((n.options.touchDevices == false) && (j())) {
                q = false
            }
            if (g.all && !g.querySelector) {
                q = false
            }
            if (q == true) {
                if ((this.options.iconDesktop == true) && (!j()) || ((this.options.iconTouch == true) && (j()))) {
                    var m = r.attr("title");
                    r.removeAttr("title");
                    var p = n.options.iconTheme;
                    var o = d('<span class="' + p.replace(".", "") + '" title="' + m + '">' + this.options.icon + "</span>");
                    o.insertAfter(r);
                    r.data("tooltipsterIcon", o);
                    r = o
                }
                var l = d.trim(n.options.content).length > 0 ? n.options.content : r.attr("title");
                r.data("tooltipsterContent", l);
                r.removeAttr("title");
                if ((this.options.touchDevices == true) && (j())) {
                    r.bind("touchstart", function (t, s) {
                        n.showTooltip()
                    })
                } else {
                    if (this.options.trigger == "hover") {
                        r.on("mouseenter.tooltipster", function () {
                            n.showTooltip()
                        });
                        if (this.options.interactive == true) {
                            r.on("mouseleave.tooltipster", function () {
                                var t = r.data("tooltipster");
                                var u = false;
                                if ((t !== b) && (t !== "")) {
                                    t.mouseenter(function () {
                                        u = true
                                    });
                                    t.mouseleave(function () {
                                        u = false
                                    });
                                    var s = setTimeout(function () {
                                        if (u == true) {
                                            t.mouseleave(function () {
                                                n.hideTooltip()
                                            })
                                        } else {
                                            n.hideTooltip()
                                        }
                                    }, n.options.interactiveTolerance)
                                } else {
                                    n.hideTooltip()
                                }
                            })
                        } else {
                            r.on("mouseleave.tooltipster", function () {
                                n.hideTooltip()
                            })
                        }
                    }
                    if (this.options.trigger == "click") {
                        r.on("click.tooltipster", function () {
                            if ((r.data("tooltipster") == "") || (r.data("tooltipster") == b)) {
                                n.showTooltip()
                            } else {
                                n.hideTooltip()
                            }
                        })
                    }
                }
            }
        },
        showTooltip: function (m) {
            var n = d(this.element);
            var l = this;
            if (n.data("tooltipsterIcon") !== b) {
                n = n.data("tooltipsterIcon")
            }
            if ((d(".tooltipster-base").not(".tooltipster-dying").length > 0) && (l.options.onlyOne == true)) {
                d(".tooltipster-base").not(".tooltipster-dying").not(n.data("tooltipster")).each(function () {
                    d(this).addClass("tooltipster-kill");
                    var o = d(this).data("origin");
                    o.data("plugin_tooltipster").hideTooltip()
                })
            }
            n.clearQueue().delay(l.options.delay).queue(function () {
                l.options.functionBefore(n, function () {
                    if ((n.data("tooltipster") !== b) && (n.data("tooltipster") !== "")) {
                        var w = n.data("tooltipster");
                        if (!w.hasClass("tooltipster-kill")) {
                            var s = "tooltipster-" + l.options.animation;
                            w.removeClass("tooltipster-dying");
                            if (k == true) {
                                w.clearQueue().addClass(s + "-show")
                            }
                            if (l.options.timer > 0) {
                                var q = w.data("tooltipsterTimer");
                                clearTimeout(q);
                                q = setTimeout(function () {
                                    w.data("tooltipsterTimer", b);
                                    l.hideTooltip()
                                }, l.options.timer);
                                w.data("tooltipsterTimer", q)
                            }
                            if ((l.options.touchDevices == true) && (j())) {
                                d("body").bind("touchstart", function (B) {
                                    if (l.options.interactive == true) {
                                        var D = d(B.target);
                                        var C = true;
                                        D.parents().each(function () {
                                            if (d(this).hasClass("tooltipster-base")) {
                                                C = false
                                            }
                                        });
                                        if (C == true) {
                                            l.hideTooltip();
                                            d("body").unbind("touchstart")
                                        }
                                    } else {
                                        l.hideTooltip();
                                        d("body").unbind("touchstart")
                                    }
                                })
                            }
                        }
                    } else {
                        d("body").css("overflow-x", "hidden");
                        var x = n.data("tooltipsterContent");
                        var u = l.options.theme;
                        var y = u.replace(".", "");
                        var s = "tooltipster-" + l.options.animation;
                        var r = "-webkit-transition-duration: " + l.options.speed + "ms; -webkit-animation-duration: " + l.options.speed + "ms; -moz-transition-duration: " + l.options.speed + "ms; -moz-animation-duration: " + l.options.speed + "ms; -o-transition-duration: " + l.options.speed + "ms; -o-animation-duration: " + l.options.speed + "ms; -ms-transition-duration: " + l.options.speed + "ms; -ms-animation-duration: " + l.options.speed + "ms; transition-duration: " + l.options.speed + "ms; animation-duration: " + l.options.speed + "ms;";
                        var o = l.options.fixedWidth > 0 ? "width:" + l.options.fixedWidth + "px;" : "";
                        var z = l.options.maxWidth > 0 ? "max-width:" + l.options.maxWidth + "px;" : "";
                        var t = l.options.interactive == true ? "pointer-events: auto;" : "";
                        var w = d('<div class="tooltipster-base ' + y + " " + s + '" style="' + o + " " + z + " " + t + " " + r + '"><div class="tooltipster-content">' + x + "</div></div>");
                        w.appendTo("body");
                        n.data("tooltipster", w);
                        w.data("origin", n);
                        l.positionTooltip();
                        l.options.functionReady(n, w);
                        if (k == true) {
                            w.addClass(s + "-show")
                        } else {
                            w.css("display", "none").removeClass(s).fadeIn(l.options.speed)
                        }
                        var A = x;
                        var p = setInterval(function () {
                            var B = n.data("tooltipsterContent");
                            if (d("body").find(n).length == 0) {
                                w.addClass("tooltipster-dying");
                                l.hideTooltip()
                            } else {
                                if ((A !== B) && (B !== "")) {
                                    A = B;
                                    w.find(".tooltipster-content").html(B);
                                    w.css({
                                        width: "",
                                        "-webkit-transition-duration": l.options.speed + "ms",
                                        "-moz-transition-duration": l.options.speed + "ms",
                                        "-o-transition-duration": l.options.speed + "ms",
                                        "-ms-transition-duration": l.options.speed + "ms",
                                        "transition-duration": l.options.speed + "ms",
                                        "-webkit-transition-property": "-webkit-transform",
                                        "-moz-transition-property": "-moz-transform",
                                        "-o-transition-property": "-o-transform",
                                        "-ms-transition-property": "-ms-transform",
                                        "transition-property": "transform"
                                    }).addClass("tooltipster-content-changing");
                                    setTimeout(function () {
                                        w.removeClass("tooltipster-content-changing");
                                        setTimeout(function () {
                                            w.css({
                                                "-webkit-transition-property": "",
                                                "-moz-transition-property": "",
                                                "-o-transition-property": "",
                                                "-ms-transition-property": "",
                                                "transition-property": ""
                                            })
                                        }, l.options.speed)
                                    }, l.options.speed);
                                    tooltipWidth = w.outerWidth(false);
                                    tooltipInnerWidth = w.innerWidth();
                                    tooltipHeight = w.outerHeight(false);
                                    l.positionTooltip()
                                }
                            }
                            if ((d("body").find(w).length == 0) || (d("body").find(n).length == 0)) {
                                clearInterval(p)
                            }
                        }, 200);
                        if (l.options.timer > 0) {
                            var q = setTimeout(function () {
                                w.data("tooltipsterTimer", b);
                                l.hideTooltip()
                            }, l.options.timer + l.options.speed);
                            w.data("tooltipsterTimer", q)
                        }
                        if ((l.options.touchDevices == true) && (j())) {
                            d("body").bind("touchstart", function (B) {
                                if (l.options.interactive == true) {
                                    var D = d(B.target);
                                    var C = true;
                                    D.parents().each(function () {
                                        if (d(this).hasClass("tooltipster-base")) {
                                            C = false
                                        }
                                    });
                                    if (C == true) {
                                        l.hideTooltip();
                                        d("body").unbind("touchstart")
                                    }
                                } else {
                                    l.hideTooltip();
                                    d("body").unbind("touchstart")
                                }
                            })
                        }
                        w.mouseleave(function () {
                            l.hideTooltip()
                        })
                    }
                });
                n.dequeue()
            })
        },
        hideTooltip: function (m) {
            var p = d(this.element);
            var l = this;
            if (p.data("tooltipsterIcon") !== b) {
                p = p.data("tooltipsterIcon")
            }
            var o = p.data("tooltipster");
            if (o == b) {
                o = d(".tooltipster-dying")
            }
            p.clearQueue();
            if ((o !== b) && (o !== "")) {
                var q = o.data("tooltipsterTimer");
                if (q !== b) {
                    clearTimeout(q)
                }
                var n = "tooltipster-" + l.options.animation;
                if (k == true) {
                    o.clearQueue().removeClass(n + "-show").addClass("tooltipster-dying").delay(l.options.speed).queue(function () {
                        o.remove();
                        p.data("tooltipster", "");
                        d("body").css("verflow-x", "");
                        l.options.functionAfter(p)
                    })
                } else {
                    o.clearQueue().addClass("tooltipster-dying").fadeOut(l.options.speed, function () {
                        o.remove();
                        p.data("tooltipster", "");
                        d("body").css("verflow-x", "");
                        l.options.functionAfter(p)
                    })
                }
            }
        },
        positionTooltip: function (O) {
            var A = d(this.element);
            var ab = this;
            if (A.data("tooltipsterIcon") !== b) {
                A = A.data("tooltipsterIcon")
            }
            if ((A.data("tooltipster") !== b) && (A.data("tooltipster") !== "")) {
                var ah = A.data("tooltipster");
                ah.css("width", "");
                var ai = d(f).width();
                var B = A.outerWidth(false);
                var ag = A.outerHeight(false);
                var al = ah.outerWidth(false);
                var m = ah.innerWidth() + 1;
                var M = ah.outerHeight(false);
                var aa = A.offset();
                var Z = aa.top;
                var u = aa.left;
                var y = b;
                if (A.is("area")) {
                    var T = A.attr("shape");
                    var af = A.parent().attr("name");
                    var P = d('img[usemap="#' + af + '"]');
                    var n = P.offset().left;
                    var L = P.offset().top;
                    var W = A.attr("coords") !== b ? A.attr("coords").split(",") : b;
                    if (T == "circle") {
                        var N = parseInt(W[0]);
                        var r = parseInt(W[1]);
                        var D = parseInt(W[2]);
                        ag = D * 2;
                        B = D * 2;
                        Z = L + r - D;
                        u = n + N - D
                    } else {
                        if (T == "rect") {
                            var N = parseInt(W[0]);
                            var r = parseInt(W[1]);
                            var q = parseInt(W[2]);
                            var J = parseInt(W[3]);
                            ag = J - r;
                            B = q - N;
                            Z = L + r;
                            u = n + N
                        } else {
                            if (T == "poly") {
                                var x = [];
                                var ae = [];
                                var H = 0,
                                    G = 0,
                                    ad = 0,
                                    ac = 0;
                                var aj = "even";
                                for (i = 0; i < W.length; i++) {
                                    var F = parseInt(W[i]);
                                    if (aj == "even") {
                                        if (F > ad) {
                                            ad = F;
                                            if (i == 0) {
                                                H = ad
                                            }
                                        }
                                        if (F < H) {
                                            H = F
                                        }
                                        aj = "odd"
                                    } else {
                                        if (F > ac) {
                                            ac = F;
                                            if (i == 1) {
                                                G = ac
                                            }
                                        }
                                        if (F < G) {
                                            G = F
                                        }
                                        aj = "even"
                                    }
                                }
                                ag = ac - G;
                                B = ad - H;
                                Z = L + G;
                                u = n + H
                            } else {
                                ag = P.outerHeight(false);
                                B = P.outerWidth(false);
                                Z = L;
                                u = n
                            }
                        }
                    }
                }
                if (ab.options.fixedWidth == 0) {
                    ah.css({
                        width: m + "px",
                        "padding-left": "0px",
                        "padding-right": "0px"
                    })
                }
                var s = 0,
                    V = 0;
                var X = parseInt(ab.options.offsetY);
                var Y = parseInt(ab.options.offsetX);
                var p = "";

                function w() {
                    var an = d(f).scrollLeft();
                    if ((s - an) < 0) {
                        var am = s - an;
                        s = an;
                        ah.data("arrow-reposition", am)
                    }
                    if (((s + al) - an) > ai) {
                        var am = s - ((ai + an) - al);
                        s = (ai + an) - al;
                        ah.data("arrow-reposition", am)
                    }
                }
                function t(an, am) {
                    if (((Z - d(f).scrollTop() - M - X - 12) < 0) && (am.indexOf("top") > -1)) {
                        ab.options.position = an;
                        y = am
                    }
                    if (((Z + ag + M + 12 + X) > (d(f).scrollTop() + d(f).height())) && (am.indexOf("bottom") > -1)) {
                        ab.options.position = an;
                        y = am;
                        V = (Z - M) - X - 12
                    }
                }
                if (ab.options.position == "top") {
                    var Q = (u + al) - (u + B);
                    s = (u + Y) - (Q / 2);
                    V = (Z - M) - X - 12;
                    w();
                    t("bottom", "top")
                }
                if (ab.options.position == "top-left") {
                    s = u + Y;
                    V = (Z - M) - X - 12;
                    w();
                    t("bottom-left", "top-left")
                }
                if (ab.options.position == "top-right") {
                    s = (u + B + Y) - al;
                    V = (Z - M) - X - 12;
                    w();
                    t("bottom-right", "top-right")
                }
                if (ab.options.position == "bottom") {
                    var Q = (u + al) - (u + B);
                    s = u - (Q / 2) + Y;
                    V = (Z + ag) + X + 12;
                    w();
                    t("top", "bottom")
                }
                if (ab.options.position == "bottom-left") {
                    s = u + Y;
                    V = (Z + ag) + X + 12;
                    w();
                    t("top-left", "bottom-left")
                }
                if (ab.options.position == "bottom-right") {
                    s = (u + B + Y) - al;
                    V = (Z + ag) + X + 12;
                    w();
                    t("top-right", "bottom-right")
                }
                if (ab.options.position == "left") {
                    s = u - Y - al - 12;
                    myLeftMirror = u + Y + B + 12;
                    var K = (Z + M) - (Z + A.outerHeight(false));
                    V = Z - (K / 2) - X;
                    if ((s < 0) && ((myLeftMirror + al) > ai)) {
                        var o = parseFloat(ah.css("border-width")) * 2;
                        var l = (al + s) - o;
                        ah.css("width", l + "px");
                        M = ah.outerHeight(false);
                        s = u - Y - l - 12 - o;
                        K = (Z + M) - (Z + A.outerHeight(false));
                        V = Z - (K / 2) - X
                    } else {
                        if (s < 0) {
                            s = u + Y + B + 12;
                            ah.data("arrow-reposition", "left")
                        }
                    }
                }
                if (ab.options.position == "right") {
                    s = u + Y + B + 12;
                    myLeftMirror = u - Y - al - 12;
                    var K = (Z + M) - (Z + A.outerHeight(false));
                    V = Z - (K / 2) - X;
                    if (((s + al) > ai) && (myLeftMirror < 0)) {
                        var o = parseFloat(ah.css("border-width")) * 2;
                        var l = (ai - s) - o;
                        ah.css("width", l + "px");
                        M = ah.outerHeight(false);
                        K = (Z + M) - (Z + A.outerHeight(false));
                        V = Z - (K / 2) - X
                    } else {
                        if ((s + al) > ai) {
                            s = u - Y - al - 12;
                            ah.data("arrow-reposition", "right")
                        }
                    }
                }
                if (ab.options.arrow == true) {
                    var I = "tooltipster-arrow-" + ab.options.position;
                    if (ab.options.arrowColor.length < 1) {
                        var R = ah.css("background-color")
                    } else {
                        var R = ab.options.arrowColor
                    }

最佳答案

听起来你的页面上没有验证插件脚本:

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js

关于javascript - 我如何摆脱这个 JS 错误 : TypeError: $(. ..).validate 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329779/

有关javascript - 我如何摆脱这个 JS 错误 : TypeError: $(. ..).validate 不是函数的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐