Добавьте пользовательское текстовое поле в button_to в дополнение к данным

У меня есть button_to называется "УДАЛИТЬ", в котором я добавил

data: { confirm: "Are you sure you want to delete?" }

Я также хотел бы добавить пользовательское текстовое поле, запрашивающее у пользователя соответствующую причину перед удалением, и затем сохранить его. Могу ли я добавить текстовое поле внутри данных, кроме стандартных confirm или же disabled вариант?

Я сделал это с window.open на данный момент, но это просто обходной путь.

2 ответа

Вы не можете добавить дополнительные поля в поле подтверждения. Потому что он получает только один параметр - сообщение. Смотрите здесь.

Я бы порекомендовал создать пользовательский диалог подтверждения для этой задачи.

Во-первых, button_to это не то же самое, что data: {confirm....} (хотя, думая об этом, вы, вероятно, используете data: {...} на button_to)


Если бы вы использовали button_to Вы можете добавить дополнительные параметры в форму, используя params опция:

<%= button_to "Text", your_path, params: {name: "John"} %>

Как описано в документации, параметры передаются как скрытые поля и, следовательно, должны быть статическими данными (не редактируемыми пользователем):

Хеш параметров, которые будут отображаться как скрытые поля внутри формы.


Поскольку вы хотите использовать data: {confirm ...}, вы должны понимать, как это работает:

confirm: 'question?' - Это позволит ненавязчивому драйверу JavaScript выдавать запрос с указанным вопросом (в этом случае результирующий текст будет вопросом?). Если пользователь принимает, ссылка обрабатывается нормально, в противном случае никаких действий не предпринимается.

Как уже говорилось, это загружает диалог "подтвердить" JS, который в основном имеет только ok/cancel определить, хочет ли пользователь продолжить.

Вы не можете отправить дополнительные параметры через стандартный диалог подтверждения.

-

Что вы можете сделать, это создать пользовательское действие подтверждения для Rails.

Это включает в себя переопределение $.rails.showConfirmationDialog(link); метод, поэтому вместо того, чтобы вызывать скромный confirm диалог, он может показать все, что вам нужно.

Вот суть:

#app/assets/javascripts/application.js
$.rails.allowAction = function(link) {
  if (link.data('confirm')) {
    $.rails.showConfirmationDialog(link);
    return false;
  } else {
    return true;
  }
};

$.rails.confirmed = function(link) {
  link.data('confirm', null);
  return link.trigger('click');
};

$.rails.showConfirmationDialog = function(link) {
  var message, title;
  message = link.data('confirm');
  title = link.data('title') || 'Warning';
  return // ->> your custom action <<-- //
};

Мы используем следующее:

#app/assets/javascripts/application.js
var myCustomConfirmBox;
$.rails.allowAction = function(element) {
  var answer, message;
  message = element.data("confirm");
  answer = false;
  if (!message) {
    return true;
  }
  if ($.rails.fire(element, "confirm")) {
    myCustomConfirmBox(element, message, function() {
      var callback, oldAllowAction;
      callback = $.rails.fire(element, "confirm:complete", [answer]);
      if (callback) {
        oldAllowAction = $.rails.allowAction;
        $.rails.allowAction = function() {
          return true;
        };
        element.trigger("click");
        $.rails.allowAction = oldAllowAction;
      }
    });
  }
  return false;
};

myCustomConfirmBox = function(link, message, callback) {
  var flash, icon, wrap;
  if (!($("flash#confirm").length > 0)) {
    icon = document.createElement("i");
    icon.className = "fa fa-question-circle";
    flash = document.createElement("flash");
    flash.setAttribute("id", "confirm");
    flash.appendChild(icon);
    flash.className = "animated fadeInDown";
    flash.innerHTML += message;
    wrap = document.getElementById("wrap");
    wrap.insertBefore(flash, wrap.childNodes[0]);
    return $(document).on("click", "flash#confirm", function() {
      return callback(link);
    });
  }
};

-

Если вы хотите передать через него дополнительный параметр, вам придется использовать его в JS. Я никогда не делал этого раньше, но я знаю, что вы можете добавить его к запросу, отправляемому на ваш сервер.

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

Другие вопросы по тегам