У меня есть простая система тегирования в рельсах, использующая ассоциацию has_many: through. Я добавляю теги в книгу (с помощью selectize. js), если она существует, или создает, если ее нет. Тем не менее, новая модальная форма тега должна автоматически закрываться при создании тега, но это больше не происходит, мне нужно перезагрузить компьютер, чтобы выбрать созданные теги. Я использую рельсы 6 с webpacker. Я пробовал эту функцию без веб-упаковщика, и все прошло хорошо.
books/form.html.erb
<%= form_with(model: book, local: true) do |form| %>
<% if book.errors.any? %>
<div id="error_explanation">
<p><%= pluralize(book.errors.count, "error") %> prohibited this book from being saved:</p>
<ul>
<% book.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<h6><%= form.label :title %></h6>
<%= form.text_field :title, class: "form-control" %>
</div>
<div class="field">
<%= form.label :tags %>
<%= form.select :tag_ids, Tag.all.pluck(:name, :id), {}, { multiple: true, class: "selectize" } %>
</div>
<div class="actions">
<%= form.submit %></p>
</div>
<% end %>
<div class="modal fade tag-modal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h6 class="modal-title" id="mySmallModalLabel">Add Tag</h6>
</div>
<div class="modal-body">
<%= form_for Tag.new do |f| %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.submit class: "btn btn-primary" %>
</div>
<% end %>
</div>
</div>
Вот js для этого
tag.js
$(document).on("turbolinks:load", function() {
var selectizeCallback = null;
$(".tag-modal").on("hide.bs.modal", function(e) {
if (selectizeCallback != null) {
selectizeCallback();
selecitzeCallback = null;
}
$("#new_tag").trigger("reset");
// $.rails.enableFormElements($("#new_tag"));
Rails.enableElement($('#new_tag')[0]);
});
$("#new_tag").on("submit", function(e) {
e.preventDefault();
$.ajax({
method: "POST",
url: $(this).attr("action"),
data: $(this).serialize(),
success: function(response) {
selectizeCallback({value: response.id, text: response.name});
selectizeCallback = null;
$(".tag-modal").modal('toggle');
}
});
});
$(".selectize").selectize({
maxItems: 5,
create: function(input, callback) {
selectizeCallback = callback;
$(".tag-modal").modal();
$("#tag_name").val(input);
}
});
});