在Ruby on Rails中使用AJAX和Javascript响应

Working with AJAX and Javascript responses in Ruby on Rails

本文关键字:AJAX Javascript 响应 Ruby on Rails      更新时间:2023-09-26

我在使用AJAX和Ruby on Rails与JQuery时遇到了一点麻烦。我尝试使用JQuery中的AJAX方法,使用它进行GET请求,并将响应传输到Ruby中,以便我可以在控制器和视图中使用它。下面是我想在视图底部运行的脚本:

function onClick() {
  $.ajax({
    url: "/posts.json",
    type: "GET",
    success: function(response) {
      return response;
    }
  });
};
onClick();

是否有一种方法可以将此响应转换为ruby,这样我就可以在我的控制器中使用它?我希望'response'是AJAX请求返回的内容:

def index
  @response = response
end

提前感谢!

您混淆了应用程序的前端后端。你的JavaScript代码位于前端,它实际上在访问者的浏览器中运行;而您的Rails控制器位于后端,它在您的web服务器上运行得很远。可以在它们之间来回发送数据,但只能作为请求生命周期的一部分,我将其总结为:

  1. 访问者发出请求来加载你的网页。
  2. 您的服务器&Rails接收请求,并决定如何将路由到控制器
  3. 你的控制器处理请求,做的东西,然后呈现一个视图成HTML(或JSON,或任何格式你想发回)。
  4. 此HTML(或JSON)作为响应发送回访问者。这个响应包含你所有的JavaScript代码,以及(实际上,你的JS代码通常在一个单独的请求中发送,由访问者的浏览器并行进行…但最终都会进入访问者的浏览器)。

所以,你所要求的——让一个JavaScript调用将它的数据发送给控制器——是不可能在一个请求中完成的。您可以让JavaScript通过请求向控制器发送数据,但访问者不会看到。

相反,我认为你只是想让你的控制器发出这个web请求,或者——因为请求是在你的同一台服务器上——让你的控制器简单地加载数据库中的所有Posts并将该数据发送给视图。例如:

# app/controllers/things_controller.rb
class ThingsController
  def index
    @posts_json = Posts.all.to_json
  end
end

然后,通过视图中的小脚本将该变量传递到JavaScript中(这部分有点棘手;您需要告诉Rails可以按原样打印JSON字符串,而不需要对其进行消毒):

# app/views/things/index.html.erb
<h1> Posts! </h1>
<script type='text/javascript'>
  var posts = <%=raw @posts_json %>;
  alert("I've got " + posts.length + " posts loaded.");
</script>

以上是一个相当标准的策略。希望这个解释对你有所帮助!