[英]Is this a good way to do AJAX request in Rails 4?
我最熟悉完整的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 Controller Action的末尾不添加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
然后在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
来轮询后台作业服务以完成操作,然后在作业完成时(成功或失败)做出适当的响应。
自然,这比所有的事情都要复杂。 但是,这就是我通常的方向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.