【问题标题】:rails - JS callback not executed with remote JSON form (jQuery UJS)rails - JS 回调未使用远程 JSON 表单执行(jQuery UJS)
【发布时间】:2012-11-22 15:23:17
【问题描述】:

在 .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 =&gt; "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。这个问题仍然悬而未决。

【问题讨论】:

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


    【解决方案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}
    

    【讨论】:

      【解决方案2】:

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

      鉴于我们有parsererror 状态以防我们提供纯 JS,我们可以:

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

      谢谢大家!

      【讨论】:

        【解决方案3】:

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

        这里有一些读物可以让你做的事情变得容易:

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

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

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

        【讨论】:

        • 重点是我正在寻找一种不显眼的方式 :) 从 JSON 响应中获取 URL 会像你提到的那样工作,但我想弄清楚“渲染 js”方法有什么问题。是完全不可能的吗?是错误还是功能?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多