Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 这是在Rails4中执行AJAX请求的好方法吗?_Ruby On Rails_Ajax - Fatal编程技术网

Ruby on rails 这是在Rails4中执行AJAX请求的好方法吗?

Ruby on rails 这是在Rails4中执行AJAX请求的好方法吗?,ruby-on-rails,ajax,Ruby On Rails,Ajax,我基本上熟悉完整的JavaScript堆栈,自从我在RubyonRails中工作以来,我对发出XHR请求的方式从来没有完全的信心,因此,我想验证我的理解。我看了下面的问题 但没有完全回答我的问题 从我的理解来看,这就是正在发生的事情。在Rails中,我们有MVC,控制器基本上就是我们控制路由渲染内容的地方。它也可以被设计成一个API,用于做CRUD之类的事情 接下来,在前端,为了简单起见,让我们使用jQuery。我们希望发出AJAX请求并处理响应 $.ajax({ url: '/n

我基本上熟悉完整的JavaScript堆栈,自从我在RubyonRails中工作以来,我对发出XHR请求的方式从来没有完全的信心,因此,我想验证我的理解。我看了下面的问题

但没有完全回答我的问题

从我的理解来看,这就是正在发生的事情。在Rails中,我们有MVC,控制器基本上就是我们控制路由渲染内容的地方。它也可以被设计成一个API,用于做CRUD之类的事情

接下来,在前端,为了简单起见,让我们使用jQuery。我们希望发出AJAX请求并处理响应

$.ajax({
  url: '/new-sandwich/'+food_id,
  type: 'post',
  data: { food_id: food_id}
})
.done(function() {
  // if it works, refresh the page
})
.fail(function(e) {
  // if it works alert the user and refresh the page
  alert(e.responseText)
  return location.reload();
})
假设这个控制器很厚,所以响应需要几秒钟

经过大约100行之后然后问题会出现在响应中。

如果失败,它会提醒用户,在刷新后,它仍会像一切正常一样进行处理。为了解决这个问题,我相信我必须在控制器操作的顶部添加更好的验证

接下来的问题是,由于这是一个post请求,我不知道在哪里重定向?如果请求成功,我希望它刷新,但我是从客户端还是从服务器上刷新?如果我没有在控制器后操作的末尾添加
render:nothing=>true
,我会得到

ActionView::MissingTemplate - Missing template sandwich/create_sandwich, application/create_sandwich

但是如果我这样做了,那么在JavaScript中这样做有意义吗?

好吧,在我的控制器中,我通常会按照以下方式做一些事情:

class FooController < ApplicationController

  def create
    ... do some stuff
    render partial: 'some_partial', locals: {if: :needed}
  end

end
因此,控制器返回一些HTML,js将该HTML插入到由
$(“#someSelector”)
定义的页面位置

如果我的控制器方法真的需要很多时间,那么我通常会按照以下思路做一些事情:

class FooController < ApplicationController

  def create
    render json: {job_id: FooCreateService.call(some: params[:thing])}, status: :ok
  end

end
我的
@pollForResults
函数将使用
@.$jobId
轮询后台作业服务以完成,然后在作业完成时(成功或失败)做出适当响应

当然,这比所有这些都要复杂一些。但是,这是我通常的方向

class FooController < ApplicationController

  def create
    render json: {job_id: FooCreateService.call(some: params[:thing])}, status: :ok
  end

end
$.ajax({
  url: '/new-sandwich/'+food_id,
  type: 'post',
  data: { food_id: food_id}
})
.done(function(data) {
  @.$jobId = data['job_id']
  @showAWorkingOnItNotification()
  @pollForResults()
})
.fail(function(e) {
  // if it works alert the user and refresh the page
  alert(e.responseText)
  return location.reload();
})