我最熟悉一个完整的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中有没有意义呢?
答案 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
轮询后台作业服务以完成,然后在作业完成时成功响应(成功或失败)。
当然,它比所有这些都复杂一点。但是,这就是我经常前进的方向。