Rails和ajax:关于回调的困惑
Rails and ajax: confusion about callback
我对rails中的ajax请求感到困惑。
我正在使用ajax提交一个表单,一切都很好。现在我必须处理回调,但是。。。
在一些教程之后,提示是添加
respond_to do |format|
format.js
end
到controler#create,然后在视图文件夹中放置一个带有响应的"create.js.erb"。
其他教程建议在assets文件夹中创建一个js文件,并处理来自js文件的回调。
有什么区别?正确的方法是什么?
两者都是处理Ajax请求回调的不同方法。我建议您使用js.erb文件来处理ajax回调,因为该文件可以识别js和Ruby代码并执行。
例如,
在您的控制器中,
def create
...
if something
@foo = true
else
@foo = false
end
在您的create.js.erb中,它可以像您想要基于@foo
值显示/隐藏一些div一样完成,您可以写像
<% if @foo %>
// do something with JS code
<% else %>
// do something else
<% end %>
如果您在assets文件夹中创建一个JS文件,那么您将无法编写如上所述的条件,因为它是一个纯JS文件,创建JS.erb是处理ajax响应的一种简单方法。
它们是两种截然不同的方法。例如,假设您只想显示一条确认用户提交的消息。如果你走create.js.erb路线,那么这个文件可能看起来像
$('#message').text('<%= j @message %>')
对ajax请求的响应是一个javascript,它对ui进行必要的更改。jQuery在接收到该javascript时执行该javascript,而您的javascript对响应的作用没有任何可见性。
另一种方法是让控制器只渲染一些数据。这可以是一些描述提交结果的JSON,也可以是一个html块。例如,您的控制器可能会执行
render json: {status: 'success', message: 'Thank you for your submission'}
使xhr看起来像的javascript
$.ajax('/some_url', {dataType: 'json'}).done(function(data){
//data is the json your controller sent
$('#message').text data.message
});
或者如果您正在渲染html
$.ajax('/some_url', {dataType: 'html'}).done(function(data){
//data is the html your controller sent
$('#message').html data
});
因此,在这种情况下,是您的javascript决定如何处理返回的数据。
就我个人而言,我不喜欢create.js.erb路由——我发现它让我的javascript更难阅读:从我的表单提交代码中,我看不出这个回调中会发生什么。
如果控制器正在生成一个需要用不同语言执行的东西,那么测试它也要困难得多,如果javascript在某些地方执行发送给它的任意代码,那么测试你的javascript也要困难的多。
我更喜欢它表现得像一个api,返回结构化数据,客户端可以对其进行适当的操作(客户端甚至可能不是一直都是浏览器,它可能是一个移动应用程序)。
- 从AJAX回调函数中分离数据
- 如何从ajax成功回调函数中读取javascript变量
- 如何处理Ajax.BeginForm()OnError OnFailure回调
- 在AJAX中使用window.location.replace'成功'回调
- AJAX之前的Dojo回调
- 如何在ajax回调中使用类变量
- AJAX成功回调-执行javascript时出现问题
- 当使用命名函数作为jquery ajax成功回调时,我需要括号吗
- jQuery AJAX错误回调未运行
- 使用Javascript通过ajax回调更新DOM
- 在Ajax中难以在JavaScript中使用回调
- 在firefox中,使用jquery ajax不会调用错误和完整回调
- Backbone,Coffescript-在AJAX中将函数作为回调传递
- php执行后的Ajax回调
- AJAX 回调在 Firefox 中失败
- $.mobile.changePage 之后的回调函数通过 AJAX 加载
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- 需要Javascript回调ajax解释
- web服务正在调用错误回调(ajax)
- 选择initselection回调ajax -不加载默认值