Добавьте пользовательское текстовое поле в 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. Я никогда не делал этого раньше, но я знаю, что вы можете добавить его к запросу, отправляемому на ваш сервер.
Таким образом, если вы обновите свой код, чтобы показать свои маршруты и код контроллера, я смогу придумать, как передать параметр для вас.