Rails和ajax:关于回调的困惑

Rails and ajax: confusion about callback

本文关键字:回调 ajax 于回调 Rails      更新时间:2023-09-26

我对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,返回结构化数据,客户端可以对其进行适当的操作(客户端甚至可能不是一直都是浏览器,它可能是一个移动应用程序)。