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

时间:2012-11-22 15:23:18

标签: jquery ruby-on-rails ruby ruby-on-rails-3 ujs

在.erb视图中考虑以下形式:

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

在某些情况下,我想在next方法中发出一个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。问题仍然存在。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

最后我已经开始工作了。但是,我已经意识到它是一般一种肮脏的方法(你们都告诉我),按原样执行传入的JS。但是,只要我的问题是关于这种肮脏的方法,我会发布一个如何让它真正起作用的想法。

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

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

谢谢大家!

答案 2 :(得分:0)

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

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

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

如何回应json RESTful:Rails 3: What is the proper way to respond to REST-ful actions with JSON in rails?

还要检测xhr:Rails detect if request was AJAX