我对rails中的ajax请求感到困惑。Rails和ajax:关于回调的困惑
我使用ajax提交表单,一切都很好。现在,我必须处理的回调,但是......
以下一些教程提示是添加
respond_to do |format|
format.js
end
到CONTROLER#创建,然后放置在视图文件夹中的“create.js.erb”与响应。
其他教程建议在assets文件夹中创建一个js文件并处理来自JS文件的回调。
有什么区别?什么是正确的方式?
我对rails中的ajax请求感到困惑。Rails和ajax:关于回调的困惑
我使用ajax提交表单,一切都很好。现在,我必须处理的回调,但是......
以下一些教程提示是添加
respond_to do |format|
format.js
end
到CONTROLER#创建,然后放置在视图文件夹中的“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
,这是可以做到像你想显示/隐藏一些div基于@foo
的值,你可以这样写,
<% if @foo %>
// do something with JS code
<% else %>
// do something else
<% end %>
虽然如果您在资产文件夹中创建JS文件,那么您将无法像上述那样编写条件,因为它是纯JS文件,创建js.erb是处理ajax响应的简单方法。
他们是两种截然不同的方法。例如,假设您要做的只是显示确认用户提交的消息。如果你走的路线create.js.erb然后该文件可能看起来像
$('#message').text('<%= j @message %>')
你的Ajax请求的响应是一个JavaScript代码,做了必要的修改UI的。 jQuery在接收到它时执行该JavaScript,并且您的JavaScript对于响应可能执行的操作没有任何可见性。
另一种方法是让你的控制器来渲染一些数据。这可以是描述提交结果的一些JSON,也可以是一段html。例如你的控制器可能会做
render json: {status: 'success', message: 'Thank you for your submission'}
的JavaScript使得XHR可能看起来像
$.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更难阅读:我无法从我的表单提交代码中看出在这个回调中可能会发生什么。
测试控制器是否产生需要用不同语言执行的某些内容的blob,以及如果在执行任意代码的位置执行测试时,这很难。我更喜欢它的行为像一个API,返回结构化数据,客户端可以适当地采取行动(客户端可能永远不是一个浏览器,它可能是一个移动应用程序)。
所以它是一样的权利? – 2014-09-24 09:10:50
不,他们是完全不同的,尽管一般情况下你可以达到同样的目的 – 2014-09-24 09:14:33
这个回调应该做什么? – 2014-09-24 07:52:30
这取决于...例如我需要清除表单输入字段或我必须执行控制器操作。我只需要知道两种方法之间的区别。 – 2014-09-24 07:58:33