Обновление переменных экземпляра через AJAX-вызов в Rails для отображения в форме - PullRequest
0 голосов
/ 26 августа 2018

Вот что я пытаюсь сделать:

  1. Пользователь вставляет URL.
  2. В поле ввода, которое пользователь вставляет, есть: onpaste, запускающая функцию urlPasted ().
  3. Функция urlPasted () отправляет форму, в которой находится поле ввода, которое выполняет вызов AJAXпользовательская функция с именем lookup_profile.
  4. В контроллере функция lookup_profile выполняет некоторые веб-запросы, а затем обновляет некоторые переменные экземпляра.
  5. Как только эти переменные обновляются (занимает ~ 5 секунд), представлениеимеет функцию, которая ждет 20 секунд и обновляет текстовые поля на модальной поверхности с результатами этих переменных экземпляра.

Вот что я пока имею в виду:

  <%= form_tag url_for(:controller => 'users', :action => 'lookup_profile'), id: "profileLookupForm", :method => 'post', :remote => true, :authenticity_token => true do  %>
      <div class="form-group row">
        <div class="col-sm-12">
          <%= text_field_tag "paste_data", nil, onpaste: "profileURLPasted();", class: "form-control"%>
        </div>
      </div>
  <% end %>

  <script type="text/javascript">
      function profileURLPasted() {
        // Once the user pastes data, this is going to submit a POST request to the controller.
        setTimeout(function () { 
            document.getElementById("profileLookupForm").submit();
        }, 100);
        setTimeout(function () { 
            prefillForm();
        }, 20000);
      };

    function prefillForm() {
    // Replace company details.
    $('#companyNameTextBox').val("<%= @company_name %>");
  };
  </script>

Воткак выглядит контроллер:

  def lookup_profile
    # bunch of code here
    @company_name = "Random"
  end

Теперь вот проблема, которая у меня есть.Когда пользователь вставляет данные, он прекрасно передает данные в custom_action lookupProfile.Однако после запуска кода lookupProfile rails не знает, что делать дальше.Я имею в виду, что это дает мне эту ошибку:

Users # lookup_profile отсутствует шаблон для этого формата и варианта запроса.request.formats: ["text / html"] request.variant: []

Когда на самом деле у меня действительно есть файл views/users/lookup_profile.js.erb.По какой-то причине он пытается отобразить версию HTML.Я не знаю почему.

Во-вторых, я попытался поместить это в контроллер до конца:

    respond_to do |format|  
        format.js { render 'users/lookup_profile'}
    end

, но это приводит к этой ошибке:

ActionController::UnknownFormat

Любая помощь будет принята с благодарностью.Я просто хочу, чтобы пользовательская функция запускалась, обновляла переменные экземпляра и позволяла мне обновлять текущую форму этими данными.

Вот еще одна ссылка на stackoverflow для чего-то похожего, что я пытаюсь сделать: Отправка Railsформа через ajax и обновление представления , но этот метод не работает (получение ошибки actioncontroller)

* EDIT 1 *

Хорошо, так что яисправил ошибку ActionController, заменив мой form_tag на:

<%= form_tag(lookup_profile_users_path(format: :js), method: :post, :authenticity_token => true, id: 'profileLookupForm', remote: true) do %>

Но теперь он фактически отображает реальный JavaScript в представлении, и я этого не хочу.Я просто хочу иметь доступ к переменным экземпляра, которые были обновлены в действии lookup_profile, а не отображать представление.

* EDIT 2 *

Так что я думаю, что мойПроблема сводится к следующему: размещение кнопки в форме и отправка из ИТ отличается от моего кода JavaScript, который отправляет форму.Если я смогу выяснить, что с этим, то, думаю, я в хорошей форме.

1 Ответ

0 голосов
/ 26 августа 2018

Вы смешиваете там несколько вещей.Прежде всего, вместо того, чтобы делать document.getElementById("profileLookupForm").submit(), вы должны сделать ajax-запрос, я думаю, что метод submit() игнорирует директиву remote: true от rails.

Итак, измените представление на:

form = getElementById("profileLookupForm");
$.post(form.action, {paste_data: this.value}, 'script')
// form.action is the url, `this` is the input field, 'script' tells rails it should render a js script

Таким образом, запрос выполняется асинхронно, и ответ не заменяет текущую страницу.

Теперь, я думаю, вы смешиваете, что @company_name не изменится с этим запросом ajax.Когда вы визуализируете форму и все остальное, @company_name заменяется фактическим значением IN THAT MOMENT и не изменится после вашего почтового запроса, так как ссылка потеряна.Итак, эта строка:

$('#companyNameTextBox').val("<%= @company_name %>");

будет

$('#companyNameTextBox').val("");

за все время.

Вам нужно ответить скриптом, который обновляет поле значениемчто вы установили @company_name (также, ожидание произвольно X секунд - это очень плохая практика).

Поэтому вместо ответа:

format.js { render 'users/lookup_profile'}

создайте представление lookup_profile.js скод, который вы хотите выполнить

$('#companyNameTextBox').val("<%= @company_name %>");

здесь, @company_name будет фактически значением, полученным с помощью тех запросов, о которых вы говорили ранее, сценарий генерируется в данный момент и исполняется как ответ на запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...