未使用远程JSON表单(jQuery UJS)执行rails-JS回调
在.erb视图中考虑以下表单:未使用远程JSON表单(jQuery UJS)执行rails-JS回调,jquery,ruby-on-rails,ruby,ruby-on-rails-3,ujs,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 %> “post”,:remote=>true,“数据类型”=>:jso
<%= form_tag(harvester_next_url, :method => "post", :remote => true, "data-type" => :json, :id => "answerForm") do %>
<div id="dynamicFormContent"></div>
<% end %>
“post”,:remote=>true,“数据类型”=>:json,:id=>“answerForm”)do%>
在某些情况下,我想在next
方法中使用
render:js=>“window.location='{definitions\u path}'”
但是,这不会在浏览器中执行。响应的正文中有“window.location…”,内容类型设置为text/javascript
,请求的accept
也有text/javascript
Rails版本是3.2.8
一些附加信息:我不想将表单操作切换为使用JS格式,因为JS回调代码只是来自控制器的可能响应之一。另一次,我需要一些JSON来处理
问题是:是否有可能在不使用客户端重定向的情况下使其工作(即从JSON响应获取window.location),等等。?好了,这对非远程表单很有效
ADD当XHR完成时,它以status=“parsererror”
结束。显然,这是因为jQuery试图将响应解析为JSON,即使它是text/javascript
。问题仍然悬而未决。如果您请求json,它不会立即呈现为javascript,这意味着您需要从json响应中获取url,例如一个'next-url'
键。您可以在ajax回调中实现这一点
以下是一些阅读材料,可以让你的工作变得简单:
Rails ujs教程(带回调):
如何以REST方式响应json:
还要检测xhr:侦听回调并在客户端执行重定向:
$('#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通常是一种肮脏的方法(你们都告诉过我)。但是,只要我的问题是关于这种肮脏的方法,如果你真的需要的话,我会发布一个如何让它工作的想法
如果我们提供纯JS,我们有parsererror
状态,我们可以:
$('#answerForm').on('ajax:error',
function(e, data, status, xhr)
{
$.globalEval(data.responseText);
}
);
谢谢大家 关键是,我正在寻找一种不太显眼的方式:)从JSON响应中获取URL将如您所提到的那样工作,但我想找出“呈现js”方法的错误。这完全不可能吗?它是一个bug还是一个特性?