Удалить / уничтожить не работает в рельсы 3 с JQuery - PullRequest
6 голосов
/ 24 сентября 2010

Мое удаление / уничтожение не работает для 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 и соответствующие плагины в моем проекте.

Люди отвечают: сначала включите прототип и т. Д., А затем установите несколько гемов и т. Д., Чтобы устранить конфликты между прототипом и jQuery. Это мусор.

Я отправил ответ. Пожалуйста, проверьте это один раз, прежде чем идти на выбор. У меня работало более 10 проектов без проблем. Все, что вам нужно сделать, это:

Удалите все файлы js из вашего каталога javascript, кроме application.js. Затем вставьте код, указанный в моем ответе, в новый файл и включите этот файл. Включите Jquery.js, и тогда все готово. Вам не нужно добавлять javascript по умолчанию (например, prototype) или какой-либо другой гем для удаления конфликтов и т. Д.

Ответы [ 4 ]

9 голосов
/ 07 мая 2011

Если вы используете Jquery, а не прототип , то вам нужно добавлять 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
7 голосов
/ 22 июня 2012

Я столкнулся с той же проблемой, с которой столкнулся Мохит, и мне также пришлось включить «Ненавязчивую библиотеку JavaScript» (или «ujs») в мои ресурсы JavaScript.В моем текущем Rails (v3.2.5) библиотека UJS будет предоставлена ​​автоматически.Вы можете убедиться в этом, увидев следующую строку в вашем Gemfile:

gem 'jquery-rails'

и следующую строку в файле app / assets / javascripts / application.js:

//= require jquery_ujs

Так как я не знал ничего лучшего, я удалил строку require jquery_ujs из моего собственного файла application.js, и мне потребовалось некоторое время, чтобы выяснить, почему мои link_to ..., :method => :delete вызовыбольше не работали!

Как только я понял проблему, было легко добавить две вышеуказанные строки обратно в соответствующие файлы, и все снова заработало, как и ожидалось.

4 голосов
/ 24 сентября 2010

Убедитесь, что вы включили в свой макет javascript-файлы Rails по умолчанию.

<%= javascript_include_tag :defaults %>
2 голосов
/ 14 марта 2012

Убедитесь, что вы включили JavaScript-файлы Rails по умолчанию в ваш макет.

<%= javascript_include_tag "application" %>
...