我已经提到了很多关于这个主题的文章,之后我更加困惑而不是清楚地理解任何事情。这主要是因为在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
}
当我在浏览器中检查ajax调用时,我可以看到我收到的有效响应包含foo.js.erb文件中定义的整个javascript。
我最大的问题不是任何特定的代码,而是了解所有部分如何组合在一起。总而言之,我似乎无法获得在rails 5环境中发出ajax请求时发生的数据流或请求响应周期。我们非常感谢您对此主题的任何参考文献的链接。
答案 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
文件中的任何内容。