Rails 5:如何在AJAX响应中获取控制器数据?

时间:2018-03-05 06:59:12

标签: javascript ruby-on-rails ajax ruby-on-rails-5

我已经提到了很多关于这个主题的文章,之后我更加困惑而不是清楚地理解任何事情。这主要是因为在rails中做同样事情的方法很多。

制作ajax调用的老派方法:  1. Javascript监视某些事件。  2.当该事件发生时(例如:按钮单击),您可以在javascript中捕获它,进行ajax调用,在该ajax调用中处理成功或错误响应。

尝试使用rails 5,rails方式: 1.在从控制器获取数据到javascript时遇到问题。

控制器:

class SomeController < ApplicationController
  def show
  end

  def foo
    @result = 'Hello World'
    respond_to do |format|
      format.js {@result}
    end
  end
end

在我看来,我有一个具有remote:true的表单,并负责将AJAX请求提交给控制器中的foo操作。类似的东西:

=form_tag url_for(action: 'foo'), remote: true, id: 'element-form' do
  =some input ....
  =some input ...

Javascript:fviews.js.erb in /views/some/foo.js.erb

$('#element-form').on ('ajax:complete', doSomething)

function doSomething(event, data) {
  console.log(data) // prints undefined
}

$('#element-form').on ('ajax:error', doSomethingElse)

function doSomethingElse(event, data) {
  console.log(data) // prints undefined
}
  1. 我做错了什么,因为我似乎无法从ajax onsuccess函数中的控制器访问数据?
  2. 我觉得使用* .js.erb文件非常狡猾。我觉得我混淆了一切(观点和javascript)。
  3. 如果我不想在我的javascript中使用* .js.erb,但我仍然希望以轨道方式进行AJAX调用(使用remote:true,respond_to ...),有没有办法可以将我的控制器数据传递给我将处理AJAX响应的javascript文件。
  4. 如何单独定义ajax响应的成功和错误处理程序?是否有一些我缺少的rails约定,它自动提供这个?
  5. 当我在浏览器中检查ajax调用时,我可以看到我收到的有效响应包含foo.js.erb文件中定义的整个javascript。

    我最大的问题不是任何特定的代码,而是了解所有部分如何组合在一起。总而言之,我似乎无法获得在rails 5环境中发出ajax请求时发生的数据流或请求响应周期。我们非常感谢您对此主题的任何参考文献的链接。

2 个答案:

答案 0 :(得分:0)

与其他任何人一样,

foo.js.erb是ERB视图。所以你照常引用你的控制器数据。

 console.log("<%= @result %>");

(你不需要在.js.erb,btw中设置ajax:complete

答案 1 :(得分:0)

所以我终于能够让整个ajax请求响应周期工作。以下是我设置整个事情的方法。

控制器逻辑保持不变。 为了更好地控制ajax请求,我将逻辑包含在some_controller.js文件中。正如Sergio在他的一条评论中指出的那样,在他的回答中,我认为在* .js.erb文件中添加任何回调方法为时已晚。

所以javascript代码如下所示:

$(document).ready(function() {
  $('#some_element').on('some_event', function doSomething() {
    makeAjaxCall();
  });

  function makeAjaxCall() {
    Rails.ajax({
        type: "POST",
        data: {mock_data: mock_data},
        url: 'post_url',
        success: function(response){...},
        error: function(error){...}
      });
  }
});

现在重要的部分是当rails控制器(动作)中的post方法完成时会发生什么。我相信rails正在寻找一些渲染视图。在这种情况下,它会查找一个js视图,该视图应该与action方法具有相同的名称(action_method.js.erb)

因此,您要发送到ajax回调块的任何控制器数据都可以简单地放入此js视图中。所以在我的案例中,/ views / some / foo.js.erb中的Javascript:foo.js.erb更改为:

<%=@result %>

毕竟,控件返回到客户端javascript,在我们的例子中是ajax成功回调方法,你在响应中可以使用*.js.erb文件中的任何内容。