首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 5:如何在AJAX响应中获取控制器数据?

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

Stack Overflow用户
提问于 2018-03-05 06:59:11
回答 2查看 1.8K关注 0票数 0

我提到了很多关于这个问题的文章,之后我变得更加困惑,而不是清楚地理解任何东西。这主要是因为rails有许多相同的方式。

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

试图用rails 5实现这一点,rails的方法是: 1.在从控制器获取数据到javascript方面有问题。

主计长:

代码语言: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操作。类似于:

代码语言:javascript
运行
复制
=form_tag url_for(action: 'foo'), remote: true, id: 'element-form' do
  =some input ....
  =some input ...

Javascript: /view/ foo.js.erb /foo.js.erb中的

代码语言:javascript
运行
复制
$('#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. 如果我不想使用*.js.erb作为我的javascript,但我仍然希望使用AJAX调用rails方式(使用rails: true,respond_to.),是否有一种方法可以将控制器数据传递给我的javascript文件,在那里我将处理AJAX响应。
  4. 如何分别定义ajax响应的成功和错误处理程序?是否有一些rails约定是我遗漏的,它自动地提供了这个功能?

当我在浏览器中检查ajax调用时,我可以看到我得到了一个有效的响应,其中包括在foo.js.erb文件中定义的整个javascript。

我最大的问题不是任何特定的代码,而是理解所有的代码是如何组合在一起的。总之,我似乎无法获得在rails 5环境中进行ajax请求时发生的数据流或请求响应周期。有关此主题的任何参考资料的链接将受到高度赞赏。

EN

回答 2

Stack Overflow用户

发布于 2018-03-11 03:47:27

因此,我终于能够让整个ajax请求响应周期正常工作。我就是这么安排的。

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

因此,javascript代码如下所示:

代码语言: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控制器(action)中的post方法完成时会发生什么。我相信rails正在寻找一些视图来呈现。在本例中,它查找与action方法(action_method.js.erb)同名的js视图。

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

代码语言:javascript
运行
复制
<%=@result %>

在所有这些之后,控件返回到客户端javascript,在我们的示例中,它是ajax成功回调方法,您可以在响应中使用您在*.js.erb文件中放置的内容。

票数 0
EN

Stack Overflow用户

发布于 2018-03-05 07:06:16

与其他视图一样,foo.js.erb是一个ERB视图。所以你和往常一样引用你的控制器数据。

代码语言:javascript
运行
复制
 console.log("<%= @result %>");

(您不需要在ajax:complete中设置.js.erb,顺便说一下)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49105003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档