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
<%= 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 %>");