Rails和ajax:关于回调的混乱

时间:2014-09-24 07:49:33

标签: javascript ruby-on-rails

我对rails中的ajax请求感到困惑。

我正在使用ajax提交表单,一切都很好。现在我必须处理回调,但是......

在一些教程之后,提示是添加

respond_to do |format|
   format.js
end

到controler #create,然后在视图文件夹中放置一个带有响应的“create.js.erb”。

其他教程建议在assets文件夹中创建一个js文件,并处理来自JS文件的回调。

有什么区别?什么是正确的方式?

2 个答案:

答案 0 :(得分:0)

两者都是处理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响应的简单方法。

答案 1 :(得分:0)

它们是两种截然不同的方法。例如,假设您要做的只是显示确认用户提交的消息。如果你沿着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'}

制作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。

我更喜欢它表现得像api,返回结构化数据,客户端可以适当地操作(客户端可能不是一直是浏览器,它可能是一个移动应用程序)。