在.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
。问题仍然存在。
答案 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