В Rails в одной форме Format.js просто не работает. Понятия не имею, почему бы и нет
Раньше это работало, и я не уверен, что это сломало!
У меня есть приложение для выставления счетов, в котором счета принадлежат клиентам. Вы можете создать нового клиента через / обычные клиенты / новый, НО я также создал модальное окно в новой форме счета-фактуры, поэтому, если у вас еще нет клиента для нового счета-фактуры, который вы заполняете, вы можете вызвать модальное окно и создайте нового клиента на месте.
И форма "Счет-фактура", и ее модальное окно "Клиент" использовали FORM_WITH, поэтому Remote автоматически принимает значение True. Затем у меня есть действие Create в моем контроллере Clients, который использует Format.js, и файл create.js.erb в моей папке Client views для обработки Javascript, который вставляет вновь созданное имя клиента в соответствующее поле в New Invoice. форма при закрытии модального окна.
Раньше это работало нормально, но теперь на @client.save действие Create клиентского контроллера всегда перенаправляет на параметр format.HTML в моем блоке Respond_To (следовательно, на страницу показа клиента), а НЕ на страницу create.js.erb.
Что я пробовал
Я перепроверил все на предмет опечаток и прочих ошибок.
Я создал совершенно другой контроллер только для действия Client Create внутри формы Invoice, но он по-прежнему делает то же самое, за исключением того, что он сообщает об ошибке ActionController::UnknownFormat в 'response_to do |format| действия Create | ' блок.
Отключены новые библиотеки Javascript, которые я установил после завершения функции
Что странно
Я использую этот же модальный подход в другой части приложения, чтобы добавить новые электронные письма клиентов в мою форму электронного счета, и он отлично работает!
Как я уже говорил, вы ТАКЖЕ можете создавать новых клиентов с помощью обычной формы /clients/new, и для этой формы Local установлено значение True. Но если я удалю Local: True, он успешно отправится с использованием файла format.js контроллера клиентов! Таким образом, ТОЛЬКО мой клиентский модальный form_with внутри формы Invoice, похоже, не может запускать успешный format.js для того же контроллера!
Я пробовал принудительно выполнить рендеринг, как вы видите ниже, но он просто загружает файл create.js.erb как текстовый файл, он не выполняет Javascript...
"@ Client.save render:js => 'client_from_invoices/create.js.erb', layout: false"
Что, как мне кажется, произошло Я начал работать с этой функцией около 5-6 недель назад. С тех пор я добавил библиотеку Javascript/ стимулов для FlatPickr и одну для автозаполнения стимулов. Единственное, о чем я могу думать, это может быть какая-то проблема с моим файлом application.js? Но весь мой другой Javascript работает через приложение, и я отключил эти библиотеки и код, который их вызывает, на всякий случай, и никакого эффекта.
Во всяком случае, это самый упорный баг, с которым я столкнулся. Я нахожусь во втором дне, пытаясь понять это.
ЛЮБАЯ ПОМОЩЬ БОЛЬШОЙ ЦЕНА, спасибо за чтение!!
Действие создания клиента
def create
@client = Client.new(client_params)
@client.user = current_user
respond_to do |format|
if @client.save
format.js
format.html { redirect_to @client, notice: 'Client was successfully created.' }
format.json { render :show, status: :created, location: @client }
else
format.js
format.html { render :new }
format.json { render json: @client.errors, status: :unprocessable_entity }
end
end
end
Модальная форма, которая не работает из формы счета-фактуры
<%= form_with(model: @client) do |form| %>
<div class="field">
<div>
<%= form.label :client_name %>
</div>
<%= form.text_field :name, class: "border border-gray-400 formfield sm: w-full mb-1 bg-gray-200 h-8 focus:outline-none focus:shadow-outline"%>
</div>
<div class="actions mt-3">
<%= form.submit class:"border border-red-500 font-semibold bg-red-500 hover:bg-red-700 text-white px-3 py-1 text-md rounded-md mr-2" %>
<button data-controller="color" class="font-poppins border border-gray-600 text-gray-600 hover:text-black hover:border-gray-900 hover:bg-gray-100 px-3 py-1 text-md rounded-md" data-action="click->modal#close color#reset_form_errors">Cancel</button>
</div>
<% end %>
Обычная / клиентская / новая форма, которая БУДЕТ работать, когда Local: True отсутствует
<%= form_with(model: client) do |form| %>
blah blah blah
<% end %>