Удаление/Уничтожение не работает в рельсах 3 с помощью jQuery

StackOverflow https://stackoverflow.com/questions/3784633

  •  05-10-2019
  •  | 
  •  

Вопрос

Мое удаление/уничтожение не работает для Rails 3.

Не для каких-то строительных лесов и даже не для новых проектов.

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

От этот вопрос.Решение — переустановка Firefox.Но у меня тоже не работает ни в хроме, ни в сафари, ни в опере.

Сгенерированный HTML-код: --

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

ПС:Пожалуйста, не говорите «включать файлы JS по умолчанию» или что-то в этом роде.Потому что меня не интересует прототип в целом, так как я использую jQuery.

РЕДАКТИРОВАТЬ/обновить, важно: это решение, когда вы вообще не хотите использовать прототип.В своем проекте я использую только jQuery и соответствующие плагины.

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

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

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

Это было полезно?

Решение

Я столкнулся с той же проблемой, что и Мохит, и мне также нужно было включить «Ненавязчивую библиотеку 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 звонки больше не работали!

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

Другие советы

Если ты используя 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

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

<%= javascript_include_tag :defaults %>

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

<%= javascript_include_tag "application" %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top