删除/销毁在使用 jQuery 的 Rails 3 中不起作用

发布于 2024-09-24 14:14:12 字数 932 浏览 4 评论 0原文

我的删除/销毁不适用于 Rails 3。

不适用于任何脚手架,甚至不适用于新项目。

<%= link_to 'Destroy', card, :confirm => 'Are you sure?', :method => :delete %> 

来自这个问题。解决方案是重新安装 Firefox。但我的也无法在 chrome、safari 或 opera 中工作。

生成的 Html 代码:--

 <a href="/categories/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>

PS:请不要说包含默认 JS 文件或其他内容。因为我对原型不感兴趣,因为我使用的是 jQuery。

编辑/更新,重要:当您根本不想使用原型时,这是解决方案。我在我的项目中仅使用 jQuery 和相应的插件。

人们的回答是:首先包含prototype等,然后安装一些gem等来消除prototype和jQuery之间的冲突。那是垃圾。

我已经发布了答案。请在选择该选项之前检查一次。为我工作了 10 多个项目,没有任何问题。您需要做的就是:

从 javascript 目录中删除除 application.js 之外的所有 js 文件。然后将我在答案中指定的代码粘贴到新文件中并包含该文件。包含 Jquery.js 然后一切就都准备好了。您不需要添加默认的 javascript(即:原型)或其他一些 gem 来消除冲突等。

My delete/destroy is not working for Rails 3.

Not for any scaffold or even for new projects.

<%= link_to 'Destroy', card, :confirm => 'Are you sure?', :method => :delete %> 

From this question. Solution is Firefox reinstalation. But mine is also not working in chrome, safari or opera.

Html code generated:--

 <a href="/categories/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>

PS: Please don't say include default JS files or something. Because I am not interested in prototype all together, as I am using jQuery.

EDIT/Update, Important: this is the solution when you don't want to use prototype at all. I am using only jQuery and respective plugins in my project.

People are answering: First include prototype etc and then install some gem etc to remove conflicts between prototype and jQuery. That's rubbish.

I have posted an answer. Please check that once before you go for the option. Worked for me for more than 10 projects without any issues. All you need to do is:

Remove all the js files from your javascript directory except application.js. Then Paste the code i specified in my answer in a new file and include that file. Include Jquery.js and then you are all set. You don't need to add default javascript (ie: prototype) or some other gem to remove conflicts etc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清眉祭 2024-10-01 14:14:12

我遇到了 Mohit 遇到的同样问题,并且还需要在我的 JavaScript 资产中包含“Unobtrusive JavaScript Library”(或“ujs”)。在我当前的 Rails (v3.2.5) 中,将自动提供 UJS 库。您可以通过查看 Gemfile 中的以下行来验证这一点:

gem 'jquery-rails'

以及 app/assets/javascripts/application.js 文件中的以下行:

//= require jquery_ujs

由于我不太了解,我从自己的 application.js 文件中删除了 require jquery_ujs 行,我花了一段时间才弄清楚为什么我的 link_to ..., :方法 => :delete 调用不再有效!

一旦我理解了问题,就很容易将上述两行添加回各自的文件中,并且一切都再次开始按预期工作。

I ran into the same issue Mohit had and also needed to include the 'Unobtrusive JavaScript Library' (or 'ujs') in my JavaScript assets. In my current Rails (v3.2.5), the UJS library will be provided automatically. You can verify this by seeing the following line in your Gemfile:

gem 'jquery-rails'

and the following line in your app/assets/javascripts/application.js file:

//= require jquery_ujs

Since I didn't know any better, I had removed the require jquery_ujs line from my own application.js file, and it took me a while to figure out why my link_to ..., :method => :delete calls weren't working any more!

Once I understood the problem, it was easy to add the above two lines back to their respective files and everything started working as expected again.

幸福不弃 2024-10-01 14:14:12

如果您使用 jQuery 而不是 Prototype,那么您需要在项目中添加 Jquery.rails.js,否则每次您尝试删除任何内容时都会显示页面。

我不记得从哪里得到解决方案和这个 Jquery.rails.js 文件。但肯定来自一些值得信赖的来源。

以下是该文件的代码:

jQuery(function ($) {
    var csrf_token = $('meta[name=csrf-token]').attr('content'),
        csrf_param = $('meta[name=csrf-param]').attr('content');

    $.fn.extend({
        /**
         * Triggers a custom event on an element and returns the event result
         * this is used to get around not being able to ensure callbacks are placed
         * at the end of the chain.
         *
         * TODO: deprecate with jQuery 1.4.2 release, in favor of subscribing to our
         *       own events and placing ourselves at the end of the chain.
         */
        triggerAndReturn: function (name, data) {
            var event = new $.Event(name);
            this.trigger(event, data);

            return event.result !== false;
        },

        /**
         * Handles execution of remote calls firing overridable events along the way
         */
        callRemote: function () {
            var el      = this,
                data    = el.is('form') ? el.serializeArray() : [],
                method  = el.attr('method') || el.attr('data-method') || 'GET',
                url     = el.attr('action') || el.attr('href');

            if (url === undefined) {
              throw "No URL specified for remote call (action or href must be present).";
            } else {
                if (el.triggerAndReturn('ajax:before')) {
                    $.ajax({
                        url: url,
                        data: data,
                        dataType: 'script',
                        type: method.toUpperCase(),
                        beforeSend: function (xhr) {
                            el.trigger('ajax:loading', xhr);
                        },
                        success: function (data, status, xhr) {
                            el.trigger('ajax:success', [data, status, xhr]);
                        },
                        complete: function (xhr) {
                            el.trigger('ajax:complete', xhr);
                        },
                        error: function (xhr, status, error) {
                            el.trigger('ajax:failure', [xhr, status, error]);
                        }
                    });
                }

                el.trigger('ajax:after');
            }
        }
    });

    /**
     *  confirmation handler
     */
    $('a[data-confirm],input[data-confirm]').live('click', function () {
        var el = $(this);
        if (el.triggerAndReturn('confirm')) {
            if (!confirm(el.attr('data-confirm'))) {
                return false;
            }
        }
    });


    /**
     * remote handlers
     */
    $('form[data-remote]').live('submit', function (e) {
        $(this).callRemote();
        e.preventDefault();
    });
    $('a[data-remote],input[data-remote]').live('click', function (e) {
        $(this).callRemote();
        e.preventDefault();
    });

    $('a[data-method]:not([data-remote])').live('click', function (e){
        var link = $(this),
            href = link.attr('href'),
            method = link.attr('data-method'),
            form = $('<form method="post" action="'+href+'">'),
            metadata_input = '<input name="_method" value="'+method+'" type="hidden" />';

        if (csrf_param != null && csrf_token != null) {
          metadata_input += '<input name="'+csrf_param+'" value="'+csrf_token+'" type="hidden" />';
        }

        form.hide()
            .append(metadata_input)
            .appendTo('body');

        e.preventDefault();
        form.submit();
    });

    /**
     * disable-with handlers
     */
    var disable_with_input_selector = 'input[data-disable-with]';
    var disable_with_form_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')';

    $(disable_with_form_selector).live('ajax:before', function () {
        $(this).find(disable_with_input_selector).each(function () {
            var input = $(this);
            input.data('enable-with', input.val())
                 .attr('value', input.attr('data-disable-with'))
                 .attr('disabled', 'disabled');
        });
    });

    $(disable_with_form_selector).live('ajax:after', function () {
        $(this).find(disable_with_input_selector).each(function () {
            var input = $(this);
            input.removeAttr('disabled')
                 .val(input.data('enable-with'));
        });
    });
});

更新

您可以从此处获取 Jquery.rails.js 的最新副本。

   https://raw.github.com/rails/jquery-ujs/master/src/rails.js

If you are using jQuery not Prototype then you need to add Jquery.rails.js in your project, otherwise every time you try to delete anything it will take you to show page.

I don't remember from where I got the solution and this Jquery.rails.js file. But sure from some trustworthy source.

Here is the code for that file:

jQuery(function ($) {
    var csrf_token = $('meta[name=csrf-token]').attr('content'),
        csrf_param = $('meta[name=csrf-param]').attr('content');

    $.fn.extend({
        /**
         * Triggers a custom event on an element and returns the event result
         * this is used to get around not being able to ensure callbacks are placed
         * at the end of the chain.
         *
         * TODO: deprecate with jQuery 1.4.2 release, in favor of subscribing to our
         *       own events and placing ourselves at the end of the chain.
         */
        triggerAndReturn: function (name, data) {
            var event = new $.Event(name);
            this.trigger(event, data);

            return event.result !== false;
        },

        /**
         * Handles execution of remote calls firing overridable events along the way
         */
        callRemote: function () {
            var el      = this,
                data    = el.is('form') ? el.serializeArray() : [],
                method  = el.attr('method') || el.attr('data-method') || 'GET',
                url     = el.attr('action') || el.attr('href');

            if (url === undefined) {
              throw "No URL specified for remote call (action or href must be present).";
            } else {
                if (el.triggerAndReturn('ajax:before')) {
                    $.ajax({
                        url: url,
                        data: data,
                        dataType: 'script',
                        type: method.toUpperCase(),
                        beforeSend: function (xhr) {
                            el.trigger('ajax:loading', xhr);
                        },
                        success: function (data, status, xhr) {
                            el.trigger('ajax:success', [data, status, xhr]);
                        },
                        complete: function (xhr) {
                            el.trigger('ajax:complete', xhr);
                        },
                        error: function (xhr, status, error) {
                            el.trigger('ajax:failure', [xhr, status, error]);
                        }
                    });
                }

                el.trigger('ajax:after');
            }
        }
    });

    /**
     *  confirmation handler
     */
    $('a[data-confirm],input[data-confirm]').live('click', function () {
        var el = $(this);
        if (el.triggerAndReturn('confirm')) {
            if (!confirm(el.attr('data-confirm'))) {
                return false;
            }
        }
    });


    /**
     * remote handlers
     */
    $('form[data-remote]').live('submit', function (e) {
        $(this).callRemote();
        e.preventDefault();
    });
    $('a[data-remote],input[data-remote]').live('click', function (e) {
        $(this).callRemote();
        e.preventDefault();
    });

    $('a[data-method]:not([data-remote])').live('click', function (e){
        var link = $(this),
            href = link.attr('href'),
            method = link.attr('data-method'),
            form = $('<form method="post" action="'+href+'">'),
            metadata_input = '<input name="_method" value="'+method+'" type="hidden" />';

        if (csrf_param != null && csrf_token != null) {
          metadata_input += '<input name="'+csrf_param+'" value="'+csrf_token+'" type="hidden" />';
        }

        form.hide()
            .append(metadata_input)
            .appendTo('body');

        e.preventDefault();
        form.submit();
    });

    /**
     * disable-with handlers
     */
    var disable_with_input_selector = 'input[data-disable-with]';
    var disable_with_form_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')';

    $(disable_with_form_selector).live('ajax:before', function () {
        $(this).find(disable_with_input_selector).each(function () {
            var input = $(this);
            input.data('enable-with', input.val())
                 .attr('value', input.attr('data-disable-with'))
                 .attr('disabled', 'disabled');
        });
    });

    $(disable_with_form_selector).live('ajax:after', function () {
        $(this).find(disable_with_input_selector).each(function () {
            var input = $(this);
            input.removeAttr('disabled')
                 .val(input.data('enable-with'));
        });
    });
});

Update

You can get latest copy of Jquery.rails.js from here.

   https://raw.github.com/rails/jquery-ujs/master/src/rails.js
草莓酥 2024-10-01 14:14:12

确保您的布局中包含默认的 Rails javascript 文件。

<%= javascript_include_tag :defaults %>

Make sure that you include default Rails javascript files in your layout.

<%= javascript_include_tag :defaults %>
征棹 2024-10-01 14:14:12

确保您的布局中包含默认的 Rails javascript 文件。

<%= javascript_include_tag "application" %>

Make sure that you include default Rails javascript files in your layout.

<%= javascript_include_tag "application" %>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文