首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过Rails中的AJAX调用更新实例变量以在表单中显示

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

Stack Overflow用户
提问于 2018-08-27 02:15:05
回答 1查看 729关注 0票数 0

这是我想要做的:

  1. 用户粘贴网址。function.
  2. urlPasted()函数提交输入框所在的表单,该函数对名为lookup_profile.
  3. In variables.
  4. Once
  5. urlPasted的自定义函数执行AJAX调用,lookup_profile函数执行一些web请求,然后更新一些实例,这些变量被更新(大约需要5秒),视图具有一个等待20秒的函数,并使用这些实例变量的结果更新模式上的文本框。

以下是我到目前为止在视图中看到的内容:

代码语言:javascript
复制
  <%= 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>

下面是控制器的外观:

代码语言:javascript
复制
  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版本。我也不知道原因。

其次,我试着把这个放在控制器的末尾:

代码语言:javascript
复制
    respond_to do |format|  
        format.js { render 'users/lookup_profile'}
    end

但这会导致以下错误:

代码语言:javascript
复制
ActionController::UnknownFormat

任何帮助都将不胜感激。我只想运行自定义函数,更新实例变量,并使用该数据更新当前表单。

下面是我正在尝试做的类似事情的另一个堆栈溢出引用:Rails submitting a form through ajax and updating the view,但此方法不起作用(获取actioncontroller错误)

*编辑1 *

好的,所以我修复了ActionController错误,将我的form_tag替换为:

代码语言:javascript
复制
<%= form_tag(lookup_profile_users_path(format: :js), method: :post, :authenticity_token => true, id: 'profileLookupForm', remote: true) do %>

但现在它实际上是将实际的javascript渲染到视图中,而我不希望这样。我只是希望能够访问在lookup_profile操作中更新的实例变量,而不是显示视图。

*编辑2 *

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-27 03:14:11

你在这里混合了一些东西。首先,我认为submit()方法忽略了rails中的remote: true指令,而不是执行document.getElementById("profileLookupForm").submit()

因此,将提交更改为:

代码语言:javascript
复制
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将被替换为当时的实际值,并且在post请求后不会更改,因为引用丢失了。所以这一行:

代码语言:javascript
复制
$('#companyNameTextBox').val("<%= @company_name %>");

将会是

代码语言:javascript
复制
$('#companyNameTextBox').val("");

一直都是。

您想要的是用一个脚本响应,该脚本用您设置为@company_name的值更新字段(而且,任意等待X秒是一种非常糟糕的做法)。

因此,与其使用以下内容进行响应,还不如:

代码语言:javascript
复制
format.js { render 'users/lookup_profile'}

使用要执行的代码创建视图lookup_profile.js

代码语言:javascript
复制
$('#companyNameTextBox').val("<%= @company_name %>");

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52029050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档