【问题标题】:RoR recall function without refreshing无需刷新的 RoR 召回功能
【发布时间】:2015-06-28 19:10:16
【问题描述】:

当我生成我的视图时,我会从 twitter 中检索一个带有类似内容的推文列表:

# Print tweets from list_id
<% @twitter_client.list_timeline(list_id).each do |tweet| %>
  <%= tweet.text %>
  <br />
<% end %>

这个结果是静态的,你只会得到这个列表的最后 20 条推文。但例如,我希望它每分钟自动刷新一次。不刷新整个页面,怎么可能召回呢?

我想到了 Ajax,但它是由 rails 生成的视图,所以 Ajax 怎么能只调用这个特定的功能呢?

感谢您的建议

【问题讨论】:

  • 是的,如果您需要在不重新加载客户端页面的情况下进行一些服务器端计算(例如检索一些推文),则需要 AJAX。您可以每分钟对您的服务器进行一次 AJAX 调用(感谢 javascript 的 setTimeout),您的服务器接收 AJAX 调用并检索新推文,然后将答案发送回客户端页面,这将需要 Javascript 来解释服务器的回答并将新推文放在页面中。
  • 感谢@MrYoshiji 的提示!

标签: javascript ruby-on-rails ajax twitter


【解决方案1】:

Ajax 通常会发出请求,然后用结果更新页面的部分。它可以向您的 Rails 应用程序发出请求,该应用程序又可以向 twitter 发出请求,获取一些数据,生成一大块 html,然后将其作为对 ajax 查询的响应的一部分发回。

原来如此

浏览器 javascript

  • 向等待响应的 /twitter_clients/123 发出 ajax 请求

Rails 服务器:

  • 获取对“/twitter_clients/123”的请求,该请求获取到例如 twitter_clients#show 的路由
  • twitter_clients#show 操作加载必要的数据以进行 twitter api 调用,进行调用,然后取回一些数据。
  • 在 show 动作的 format.js 处理程序中,将一个 div 替换为部分“twitter_clients/feed”,例如 id 为“twitter_feed”。

(实际上,控制器使用数据使用该部分构建一个 html 块,然后将其发送回 ajax 请求(它正在耐心等待它),告诉请求“获取这块文本并使用它用 id "twitter_feed" 替换 div 的内容。)

返回浏览器:

  • ajax 响应返回,javascript 将 #twitter_feed div 替换为响应的内容。

【讨论】:

  • 谢谢@Max 我会走这条路,这似乎也不难实现!
  • 为了节省时间和最大化性能使用,您可以使用 JSON 而不是呈现 HTML 内容。然后,在客户端,Javascript 将处理这个 JSON 并显示推文(创建 div、span 等)。此外,如果由于推文检索过程而对/twitter_clients/123 的第一个请求需要一些时间来计算,您可以简单地呈现一个空视图(没有推文),然后在您的视图中触发 AJAX 调用以检索第一条推文。就像异步加载一样。
  • 是的,从性能的角度来看,这更好,但是它需要javascript知道twitter数据在页面上的排列方式,即知道视图模板的结构。这可能很不方便,而且肯定更容易损坏。另一方面,您可以使用现有的 twitter feed 插件,这些插件带有自己的标记和样式,可能适合您的需求。然后你就可以从等式中完全删除 Rails。
猜你喜欢
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多