这是在Rails 4中执行AJAX请求的好方法吗?

时间:2017-07-11 20:01:52

标签: ruby-on-rails ajax

我最熟悉一个完整的JavaScript堆栈,自从我在Ruby on Rails工作以来,我对XHR请求的方式从未完全自信,因此,我想验证我的理解。我查看了以下问题

但没有完全回答我的问题。

以下是我理解中发生的事情。在Rails中我们有MVC,而Controller实际上是我们控制路由呈现的地方。它也可以设计为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中有没有意义呢?

1 个答案:

答案 0 :(得分:2)

嗯,在我的控制器中,我通常会做一些事情:

class FooController < ApplicationController

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

end

然后在javascript中,例如:

$.ajax({
  url: '/new-sandwich/'+food_id,
  type: 'post',
  data: { food_id: food_id}
})
.success(function(data) {
  $('#someSelector').html(data)
})
.fail(function(e) {
  // if it works alert the user and refresh the page
  alert(e.responseText)
  return location.reload();
})

因此,控制器返回一些HTML,并且js将该HTML插入页面中$('#someSelector')定义的位置。

如果我的控制器方法确实需要花费很多时间,那么我通常会采取以下措施:

class FooController < ApplicationController

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

end

然后我的ajax电话可能看起来像:

$.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();
})

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

当然,它比所有这些都复杂一点。但是,这就是我经常前进的方向。