【问题标题】:How to fail Ajax request in Rails?如何在 Rails 中失败 Ajax 请求?
【发布时间】:2012-02-16 05:10:45
【问题描述】:

当用户点击特定项目时,我使用jQuery's post method 更新数据库中的内容:

$.post("/posts/" + post_id + "/update_something", 
       { some_param: some_value }, 
       success_handler);

update_something 看起来像这样:

def update_something
  post = Post.find(params[:id])
  post.update_attributes(:some_field => params[:some_param])
  render :nothing => true
end

问题是如果update_attributes失败,请求仍然成功,success_handler被执行。

update_attributes 失败以致success_handler 不会被执行时,如何导致请求失败?

【问题讨论】:

    标签: jquery ruby-on-rails ajax ruby-on-rails-3 jquery-post


    【解决方案1】:

    您可以在 Rails 中执行render :status => 400(或其他一些错误代码),这将触发$.ajax()error 回调,或者您可以渲染一些带有错误消息的JSON:

    render :json => { :success => false }

    然后在您的 success_handler 函数中,您将:

    function success_handler (response) {
        if (response.success) {
            // do stuff
        }
    }
    

    编辑:

    哦,update_attributes 在失败时返回 false。因此,您可以基于此呈现您的响应。

    2 年后编辑:

    几年后,看到这有一些支持,我强烈建议使用status: 400 方法而不是渲染200。这就是 AJAX 请求中的 error 处理程序的用途,并且应该以这种方式使用。

    【讨论】:

      【解决方案2】:

      好吧,你必须添加一个错误处理程序,并给它一个错误来处理。因此,在您的 JavaScript 中:

      $.post( "/posts/" + post_id + "/update_something",
              { some_param : some_value }
            )
        .done( successHandler )
        .fail( errorHandler )      // define errorHandler somewhere, obviously
      ;
      

      在 Rails 中:

      def update_something
        post    = Post.find params[ :id ]
      
        success = post.update_attributes :some_field => params[ :some_param ]
      
        head success ? :ok : :internal_server_error
      end
      

      注意:500 在这里可能是也可能不是适当的错误代码——在400s and 500s 中选择一个合适的。

      【讨论】:

      • 谢谢!我不熟悉 jQuery 的 successerror 方法。试图寻找文档但没有成功。可以指点一下吗?
      • +1 您也可以只返回一个成功/失败标头。您在 Rails 中的最后一行看起来像 head success ? :ok : :internal_server_error,其中head :ok 将返回状态 200,head :internal_server_error 将返回状态 500。
      • Misha: postgetajax 返回一个 jqXHR 对象,它是(很糟糕的)documented here。仔细阅读,我注意到errorsuccess 已被弃用,现在您应该使用Deferreddonefail。我更新了我的代码以反映这一点,并结合了@gg_s 的建议,这是一个很好的提示。
      猜你喜欢
      • 2017-04-02
      • 2018-11-30
      • 2012-09-06
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多