这是我想要做的:
以下是我到目前为止在视图中看到的内容:
<%= 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
任何帮助都将不胜感激。我只想运行自定义函数,更新实例变量,并使用该数据更新当前表单。
下面是我正在尝试做的类似事情的另一个堆栈溢出引用:Rails submitting a form through ajax and updating the view,但此方法不起作用(获取actioncontroller错误)
*编辑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操作中更新的实例变量,而不是显示视图。
*编辑2 *
因此,我认为我的问题可以归结为:在表单中放置一个按钮并从IT提交与我的提交表单的javascript代码不同。如果我能弄清楚这是怎么回事,我想我的状态可能会很好。
发布于 2018-08-27 03:14:11
你在这里混合了一些东西。首先,我认为submit()
方法忽略了rails中的remote: true
指令,而不是执行document.getElementById("profileLookupForm").submit()
。
因此,将提交更改为:
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请求后不会更改,因为引用丢失了。所以这一行:
$('#companyNameTextBox').val("<%= @company_name %>");
将会是
$('#companyNameTextBox').val("");
一直都是。
您想要的是用一个脚本响应,该脚本用您设置为@company_name
的值更新字段(而且,任意等待X秒是一种非常糟糕的做法)。
因此,与其使用以下内容进行响应,还不如:
format.js { render 'users/lookup_profile'}
使用要执行的代码创建视图lookup_profile.js
$('#companyNameTextBox').val("<%= @company_name %>");
在这里,@company_name
实际上是您之前告诉过的那些请求所获得的值,脚本是在此时生成的,并作为请求的响应执行。
https://stackoverflow.com/questions/52029050
复制相似问题