3

在 .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,这适用于非远程表单。

ADDstatus = "parsererror"在 XHR 完成时结束。显然,这是因为 jQuery 尝试将响应解析为 JSON,即使它是text/javascript. 这个问题仍然悬而未决。

4

3 回答 3

1

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

鉴于我们parsererror在提供纯 JS 的情况下具有状态,我们可以:

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

感谢大家!

于 2012-11-23T11:33:55.763 回答
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}
于 2012-11-23T09:54:18.697 回答
0

如果您要求 json,它不会立即呈现为 javascript,这意味着您需要从 json 响应中获取 url,例如'next-url'密钥。您可以在 ajax 回调中执行此操作。

这里有一些阅读应该可以使您尝试做的事情变得容易:

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

如何以 RESTfully 方式响应 json:Rails 3:在 Rails 中使用 JSON 响应 REST-ful 操作的正确方法是什么?

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

于 2012-11-22T16:08:44.250 回答