如何定期获取/更新rails中的值?

Ami*_*Pal 10 ruby ajax model-view-controller ruby-on-rails ruby-on-rails-4

我们来看一个场景:

counter 10 seconds
Run Code Online (Sandbox Code Playgroud)
  • 用户访问了show.html.erb页面
  • show.html.erbdatabase使用中获取值<%= @post.value %>.
  • 计数器启动,计数器的每次迭代都是为了10 seconds.
  • 每次10 seconds我都想改变@post.value使用utility类.
  • 更新@post.valuein数据库.
  • show.html.erb自动刷新并<%= @post.value %>显示更新的值
  • 上面的过程将循环运行,直到用户移动到其他页面.

如果我必须简化代码中的问题,那么它会喜欢这样:

查看页面

<%= @post.value %>
<%= @post.name %>
Run Code Online (Sandbox Code Playgroud)

控制器方法

def show
 @post = Post.find(params[:id])
end

def update
....   #It's empty right now
end

def fetching_value_from_PostUpdate(current_value)
 .. # Now I need to update the value in database
end
Run Code Online (Sandbox Code Playgroud)

实用类

我想post.value在这个类中编写的方法的基础上更新.伪代码:

class PostUpdate
 @@instance_variable   

 def initialize(post_value)
   @@instance_variable = Marshal.load(Marshal.dump(post_value))
 end

  #Method required to calculate the value
def update_data_in_database
 ...
return data
end
Run Code Online (Sandbox Code Playgroud)

问题

  • 我在哪里放柜台?客户端还是服务器端?我不想background jobs在rails中使用.
  • 我需要在show方法中进行哪些更改,以便在每个间隔页面之后自动刷新并传递更新的值@post.value

谢谢你的帮助!

小智 1

我想说最简单的方法是使用ActionController::Live。使用它,您将能够将 SSE(服务器发送事件)发送到您的客户端,同时让 js 脚本捕获并更新您的<%= @post.value %>. 这是一个非常好的使用手册。

尽管如此,从我的角度来看,实现你想做的事情的最合适的方法是使用像Faye这样的东西。它是一个发布/订阅消息系统,允许您在新数据出现时立即用新数据更新您的客户端,例如,您可以after_save在模型中设置并向所有订阅的客户端发布更新。当然还有一个 gem 也叫faye来包装它的用法。