text_area с событием onkeyup отправляет ajax-запрос и отображает, но представление не изменяется - PullRequest
0 голосов
/ 20 января 2019

В приложении Ruby on Rails я создаю простую форму (form_for) для отправки текста.Но я хотел бы отобразить обновленный текст на той же странице, поэтому я использую remote: true (для отправки в виде Ajax).Это работает нормально, если я наберу text_area и нажму кнопку отправки.

Однако я бы хотел немного подправить, я установил для события onkeyup: 'submitIt()' text_area и определил function submitIt() под формой.как JQuery ($('#form-id').submit()).На этот раз форма отправляется после каждого нажатия ключа, НО она отправляется в [text / html] и больше не отвечает на действие update.js.erb.Хотя он обновляет текст, потому что обновление действия в контроллере работает, он просто не отвечает на визуализацию представления так, как я хочу.Это полностью противоречит цели, и я очень разочарован чтением блогов stackoverflow и ruby ​​rails, но безрезультатно.

У кого-нибудь есть предложения?

Моя форма:

<%= form_for @product, remote: true, html: {id: 'edit-form'} do |f| %>
<ul class="errors"> </ul>

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
<%= f.label :price %>
<%= f.text_field :price, onkeyup: 'submitIt()' %>

<%= f.submit %>

<% end %>

<script>
function submitIt() {
    $("#edit-form").submit();
}
</script>

Теперь я изменяю сценарий следующим образом:

<script>
function submitIt() {
    let valuesToSubmit = $('#edit-form').serialize();
    $.ajax({
        type: 'POST',
        url: $('#edit-form').attr('action'),
        data: valuesToSubmit,
        dataType: "JSON"
    }).success(function(json){
        console.log("success", json);
    });

}
</script>

Когда я печатаю и смотрю на сервер, запрос представляет собой Ajax (JSON), изменение продукта фиксируется, и он отображает update.js.erbс 200OK, (хотя это не выводит сообщение об успехе на консоль).И ничего в представлении не меняется.Если я нажимаю кнопку «Отправить», она проходит в той же последовательности (журнал сервера совпадает с тем, что я ввожу), но фактически меняет представление.Почему?

Вот журнал сервера моего поведения при наборе:

Started PATCH "/products/1" for 127.0.0.1 at 2019-01-20 11:23:59 +0100
Processing by ProductsController#update as JSON
  Parameters: {"utf8"=>"✓", "product"=>{"name"=>"Nintendo", "price"=>"203"}, "authenticity_token"=>"vKsD9PcUN0DPLoWn44sYHZ6Fo0iB32u5nXyEmEw/WrYfiUC4qpKxTHWupdT8iMzHF5ji4CbWwVh7FrkxNJMFKQ==", "id"=>"1"}
  Product Load (2.4ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/products_controller.rb:21
   (1.1ms)  begin transaction
  ↳ app/controllers/products_controller.rb:22
  Product Update (18.6ms)  UPDATE "products" SET "price" = ?, "updated_at" = ? WHERE "products"."id" = ?  [["price", 203.0], ["updated_at", "2019-01-20 10:23:59.220778"], ["id", 1]]
  ↳ app/controllers/products_controller.rb:22
   (105.2ms)  commit transaction
  ↳ app/controllers/products_controller.rb:22
  Rendering products/update.js.erb
  Product Load (10.1ms)  SELECT "products".* FROM "products"
  ↳ app/views/products/_index.html.erb:1
  Rendered products/_index.html.erb (134.5ms)
  Rendered products/update.js.erb (161.3ms)
Completed 200 OK in 494ms (Views: 196.0ms | ActiveRecord: 137.5ms)

Вот тот, где я нажимаю кнопку:

Started PATCH "/products/1" for 127.0.0.1 at 2019-01-20 11:22:46 +0100
Processing by ProductsController#update as JS
  Parameters: {"utf8"=>"✓", "product"=>{"name"=>"Nintendo", "price"=>"20"}, "authenticity_token"=>"vKsD9PcUN0DPLoWn44sYHZ6Fo0iB32u5nXyEmEw/WrYfiUC4qpKxTHWupdT8iMzHF5ji4CbWwVh7FrkxNJMFKQ==", "commit"=>"Update Product", "id"=>"1"}
  Product Load (2.1ms)  SELECT  "products".* FROM "products" WHERE "products"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/products_controller.rb:21
   (1.2ms)  begin transaction
  ↳ app/controllers/products_controller.rb:22
   (1.1ms)  commit transaction
  ↳ app/controllers/products_controller.rb:22
  Rendering products/update.js.erb
  Product Load (2.5ms)  SELECT "products".* FROM "products"
  ↳ app/views/products/_index.html.erb:1
  Rendered products/_index.html.erb (135.0ms)
  Rendered products/update.js.erb (161.0ms)
Completed 200 OK in 321ms (Views: 197.0ms | ActiveRecord: 6.8ms)

Они одинаковые.

Теперь я создаю черновик приложения для проверки, кнопка отправки работает для создания нового продукта, но не отображает правильное представление для действия обновления.Очень странно.Единственное отличие в журнале сервера - это запросы PATCH и POST.

Gemfile:

...
ruby '2.5.1'
gem 'rails', '~> 5.2.2'
gem 'jquery-rails'
...

Я добавляю это в application.js

//= require jquery

1 Ответ

0 голосов
/ 20 января 2019

Проблема в том, что rails-ujs запускает отправку по-разному, поэтому решение может состоять в том, чтобы вызвать поведение по умолчанию https://github.com/rails/rails/issues/29546#issuecomment-313572043

<script>
function submitIt() {
   var editForm = $("#edit-form")[0];
   Rails.fire(editForm, 'submit');
}
</script> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...