繁体   English   中英

rails - 使用远程JSON格式(jQuery UJS)不执行JS回调

[英]rails - JS callback not executed with remote JSON form (jQuery UJS)

请考虑.erb视图中的以下表单:

<%= form_tag(harvester_next_url, :method => "post", :remote => true, "data-type" => :json, :id => "answerForm") do %>
<div id="dynamicFormContent"></div>
<% end %>

在某些情况下,我想next使用render :js => "window.location = '#{definitions_path}'"方法中发出一个JS回调render :js => "window.location = '#{definitions_path}'"

但是,这不会在浏览器中执行。 响应在正文中有“window.location ...”, content-type设置为text/javascript ,请求的accept也有text/javascript

Rails版本是3.2.8。

一些额外的信息:我不想将表单操作切换为使用JS格式,因为JS回调代码只是控制器可能的响应之一。 另一次,我需要一些JSON来处理。

问题是:是否有可能在不使用客户端重定向 (即从JSON响应中获取window.location)等的情况下使其工作? AFAIK,这适用于非远程表单。

ADD当XHR完成时,它以status = "parsererror"结束。 显然,这是因为jQuery尝试将响应解析为JSON,即使它是text/javascript 问题仍然存在。

听取回调并在客户端进行重定向:

$('#answerForm').on('ajax:success', function(data) {
  if (data.url) {
    window.location = data.url;
  } else {
    // do something else...
  }
})

# -- controller code
render json: {url: definitions_path}

最后我得到了它的工作。 但是,我已经意识到它通常是一种肮脏的方法(你们都这么告诉我)按原样执行传入的JS。 但是,只要我的问题是关于那种肮脏的方法,我会发布一个如何让它成功的想法,如果你真的需要它。

鉴于我们提供parsererror状态以防我们提供普通JS,我们可以:

$('#answerForm').on('ajax:error',
  function(e, data, status, xhr)
  {
    $.globalEval(data.responseText);
  }
);

感谢大家!

如果你要求json,它将不会立即呈现为javascript,这意味着你需要从json响应中获取url,例如'next-url'键。 你可以在ajax回调中做到这一点。

这里有一些阅读应该让你想要做的事情变得简单:

Rails ujs教程(带回调): http//www.alfajango.com/blog/rails-3-remote-links-and-forms/

如何回应json RESTful: Rails 3:在rails中使用JSON响应REST-ful动作的正确方法是什么?

还要检测xhr: Rails检测请求是否是AJAX

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM