Javascript 通过AJAX调用Rails更新实例变量以显示在表单中

Javascript 通过AJAX调用Rails更新实例变量以显示在表单中,javascript,ruby-on-rails,ajax,Javascript,Ruby On Rails,Ajax,以下是我想做的: 用户粘贴一个URL 用户粘贴的输入框有一个:onpaste,它触发urlPasted()函数 urlPasted()函数提交输入框所在的表单,该表单对名为lookup_profile的自定义函数进行AJAX调用 在控制器中,lookup_profile函数执行一些web请求,然后更新一些实例变量 一旦这些变量被更新(大约需要5秒),视图就会有一个函数等待20秒,并用这些实例变量的结果更新模态上的文本框 以下是我迄今为止的观点: <%= form_tag url_for

以下是我想做的:

  • 用户粘贴一个URL
  • 用户粘贴的输入框有一个:onpaste,它触发urlPasted()函数
  • urlPasted()函数提交输入框所在的表单,该表单对名为lookup_profile的自定义函数进行AJAX调用
  • 在控制器中,lookup_profile函数执行一些web请求,然后更新一些实例变量
  • 一旦这些变量被更新(大约需要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>
    
    现在我有个问题。当用户粘贴数据时,它会完全提交到自定义的_action lookupProfile。然而,在lookupProfile运行其代码之后,rails不知道之后该做什么。我的意思是,它给了我这个错误:

    ActionController::UnknownFormat
    
    用户#查找"配置文件缺少此请求格式的模板,并且 变体。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引用,我正在尝试做类似的事情:但是这个方法不起作用(获取actioncontroller错误)

    *编辑1*

    好的,我通过将我的form_标记替换为以下内容修复了ActionController错误:

    <%= form_tag(lookup_profile_users_path(format: :js), method: :post, :authenticity_token => true, id: 'profileLookupForm', remote: true) do %>
    
    true,id:'profileLookupForm',remote:true)do%>
    
    但现在它实际上是将实际的javascript呈现到视图中,我不希望这样。我只是希望能够访问在lookup_profile操作中更新的实例变量,而不是显示视图

    *编辑2*


    所以我认为我的问题可以归结为:在表单中放置一个按钮并从中提交与提交表单的javascript代码不同。如果我能弄清楚这是怎么回事,那么我想我的状态可能很好。

    你在那里混合了一些东西。首先,与其执行
    document.getElementById(“profileLookupForm”).submit()
    您应该执行一个ajax请求,我想
    submit()
    方法会忽略来自rails的
    remote:true
    指令

    因此,将提交更改为:

    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\u name
    不会随着ajax请求而改变。当您呈现表单和其他所有内容时,
    @company\u name
    将在此时被替换为实际值,并且在您的post请求后不会更改,因为引用已丢失。所以这一行:

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

    您需要的是使用脚本响应,该脚本使用设置为
    @company\u name
    的值更新字段(另外,任意等待X秒是一种非常糟糕的做法)

    因此,与其用以下方式回应:

    format.js { render 'users/lookup_profile'}
    
    使用要执行的代码创建一个视图
    lookup\u profile.js

    $('#companyNameTextBox').val("<%= @company_name %>");
    
    $(“#公司名称文本框”).val(“”);
    

    在这里,
    @company\u name
    实际上是您之前告诉过的那些请求所获得的值,此时将生成脚本,并将其作为请求的响应。

    感谢您在此提供的帮助。无论出于何种原因,当使用您提到的post数据提交表单时,post数据不包含“粘贴数据”或其值。看来这是最后一件事了。如果我现在按照您的其他说明单击某个按钮上的submit(提交),一切都会正常工作(包括替换表单文本字段)。
    $('#companyNameTextBox').val("<%= @company_name %>");