У меня есть форма, которая позволяет пользователю отправлять HTML, и я просто хочу внести несколько изменений в текст (например, заменить название компании на одно в Active Record), а затем заменить HTML внутри текстового поля. Однако играет не очень хорошо. По какой-то причине попытка заменить текстовое поле содержимым, которое было отправлено в его запросе POST, не работает. Ничего не произошло.
Вот моя форма просмотра:
<div class = "modal-body">
<div class = "form-group row">
<div class = "col-sm-12">
<%= form_tag(convert_email_template_path(format: :js), method: :post, :authenticity_token => true, id: 'importEmailForm', remote: true) do %>
<%= text_area_tag 'import_email', nil, rows: 10, placeholder: "Paste the headers of your email here.", class: "form-control" %>
<% end %>
</div>
</div>
</div>
<div class = "modal-footer">
<%= link_to '<i class = "fa fa-download"></i> Import'.html_safe, '#', onclick: "importEmail();", class: "btn btn-success btn-sm" %>
</div>
В общем, importEmail () выглядит так:
function importEmail() {
setTimeout(function () {
$.ajax({
type: 'POST',
url: $("#importEmailForm").attr("action"),
data: $("#importEmailForm").serialize(),
});
}, 100)
};
который в основном отправляет форму в представление. Мне нужно захватить эти данные POST, внести одно или два изменения, а затем продолжить замену textarea измененным содержимым.
Теперь, если я сделаю это на простом javascript, это будет нормально:
#views/templates/convert_email.js.erb
var sourceBody = $('#import_email').val();
var start_position = sourceBody.indexOf("<html>");
var stop_position = sourceBody.indexOf("</html>");
var html = sourceBody.substring(start_position, stop_position);
var fixed_html = html.replace(/(=\n)/g, '');
// Grab body.
var iframe = document.getElementsByClassName("fr-iframe")[0]
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;
// get the element in question
const input = innerDoc.getElementsByTagName("body")[0];
// Before pasting data, let's make sure the code view is turned OFF.
if ($('textarea').froalaEditor('codeView.isActive') == true) {
$('textarea').froalaEditor('codeView.toggle');
}
// dispatch keyboard events
input.innerHTML = fixed_html;
// Close modal.
$('#Modal').modal('toggle')
Но если захватить эти данные POST с помощью params[:import_email] и сделать что-то вроде этого:
#controllers/templates.rb
body = params[:import_email]
@body = body.gsub("=\n", "")
и передайте это в представление javascript.
#views/templates/convert_email.js.erb
// Grab body.
var iframe = document.getElementsByClassName("fr-iframe")[0]
var innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;
// get the element in question
const input = innerDoc.getElementsByTagName("body")[0];
// log codeview status
var codeView = 0
// Before pasting data, let's make sure the code view is turned OFF.
if ($('textarea').froalaEditor('codeView.isActive') == false) {
codeView = 0;
$('textarea').froalaEditor('codeView.toggle');
} else {
codeView = 1;
}
function
// dispatch keyboard events
input.innerHTML = "<%= @body %>";
resizeFroala();
// Close modal.
$('#Modal').modal('toggle')
Ничего не произошло. Возможно, есть способ рассматривать текстовое поле как исходный код или что-то в этом роде?
При использовании первого метода (только javascript) fixed_html выглядит в консоли так:
Я хочу, чтобы @body выглядел так, но для этого мне нужно сделать это в контроллере:
body = params[:import_email]
@body = body.gsub("=\r", "\r").gsub("\n", "").gsub("\r", "").gsub("\t", "")
но попытка записать это в консоль выглядит так:
Извините за путаницу. Надеюсь, это имеет смысл. Я просто хочу делать то, что безупречно работает в Javascript, но в Rails.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Думаю, я наконец понял это. Не понял, что рельсы использовали <%== %> в дополнение к <%= %>
Изменил мой код на:
input.innerHTML = "<%== j @body %>";
и это помогло. Вот это да.