【问题标题】:Rails 4/AJAX GET data from controllerRails 4/AJAX 从控制器获取数据
【发布时间】:2016-07-15 19:14:21
【问题描述】:

我之前发布了一个非常糟糕的问题,所以我重新发布并使其成为 MVCE。

我正在使用 Rails 和 AJAX 构建消息传递服务。到目前为止,我可以通过表单提交消息,它会在 HTML DOM 中更新,一个 AJAX POST 方法会将其发送到控制器,控制器会将其保存在数据库中。

现在我需要添加一个 AJAX 方法来获取刚刚提交的消息——以便其他用户(在其他浏览器中)能够查看它。

目前,这是一种 hack 工作方式,在我的 JS 代码中,我设置了一个超时,每半秒调用一次 AJAX GET 函数。有没有更好的方法来做到这一点——比如,一旦控制器保存了消息,它就可以调用 AJAX 函数吗? AJAX 代码如下所示:

function retrieveMessages(){
  var message;
  <%debugger%>
  $.ajax({
    type:"GET",
    url:"<%= messages_get_path %>",
    dataType:"json",
    data: { what_goes_here: "blah" }, //this is the part I do not understand -- see below
    success:function(data){
      message = data;
      console.log(data)
    }
  });

  setTimeout(retrieveMessages, 500);
}

$(document).ready(function(){
  //get messages
  setTimeout(retrieveMessages, 500);
... more irrelevant

data: { what_goes_here: "blah" } 这行对我来说没有意义。控制器将数据发回以存储到data: 的语法是什么?此外,从控制台我可以看到 what_goes_here 正在作为参数传递给控制器​​——这对我来说又没有意义。

我的路线看起来像这样get 'messages/get', :to =&gt; 'messages#get'(这可能不正确?)

rake routes 显示

  messages_get GET    /messages/get(.:format)        messages#get

到目前为止,我的控制器中除了 respond_to 之外没有任何其他内容,因为此时我只是想调用控制器。将数据发送回 AJAX 方法的语法是什么?

def get
  debugger
  respond_to do |format|
    format.html
    format.json {render json: @variable} //is this @variable being passed to the AJAX call?
  end
end

更新

这对我来说更有意义... AJAX 方法只是调用def get 函数。 def get 函数然后在数据库中找到消息,并将其存储在实例变量中。随后,我可以添加一些将其插入 DOM 的 Javascript 代码。但是我的路由一定有问题,因为我(在控制台中)得到http://localhost:3000/messages/get 404 (Not Found)

【问题讨论】:

  • 您的意思是使用其他浏览器的其他用户应该在消息提交后立即看到?
  • @NicNilov 正确,这应该有完全不同的方式吗?
  • data: { what_goes_here: "blah" } 用于在请求中提供额外的参数,正如您自己注意到的那样。由于您似乎不需要额外的参数来刷新消息,您可以删除此行。
  • @NicNilov AJAX 方法中存储的数据在哪里?控制器将其发回的语法是什么?它可以只是一个实例变量吗?其实是有道理的,AJAX只是调用action,它在DB中找到一个实例变量,然后JS代码将其插入到DOM中
  • 要从控制器发回数据,您通常会渲染一个&lt;action name&gt;.json.erb 模板。这会导致一段 JSON 作为您的 ajax 调用的结果被发回。它将作为参数提供给您的 success 回调。

标签: javascript jquery ruby-on-rails ajax ruby-on-rails-4


【解决方案1】:

正如您所怀疑的那样,您正在做的事情是无效的。在线的用户越多,这些刷新请求的负载就越多,其中大多数可能不会返回新数据。

您应该考虑更积极的方式来通知您的浏览器有关服务器上的更改。一种选择是使用ActionCable

【讨论】:

    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2016-07-24
    • 2020-08-11
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多