Rails与websockets:在模型更改时触发控制器方法

时间:2013-12-25 16:26:27

标签: ruby-on-rails ruby websocket rails-activerecord

我目前正在开发一款rails应用。该应用程序通过守护程序(在后台运行)获取温度数据。每次保存新的温度对象并且温度超过一定水平时,我想向用户显示新数据(通过websockets异步)。

要处理websocket通信,使用websocket-rails gem(https://github.com/websocket-rails/websocket-rails)。

websocket通信本身工作正常。但我不知道如何在不违反mvc原则的情况下触发模型更改的websocket控制器方法。

有解决此问题的干净方法吗?

其他信息:

目前守护进程每20秒添加一个温度对象。但是这个值取决于设置和测量点的数量。

温度模型:

# == Schema Information
#
# Table name: measurements
#
#  id          :integer          not null, primary key
#  value       :float
#  measured_at :datetime
#  created_at  :datetime
#  updated_at  :datetime
#

class Measurement < ActiveRecord::Base

end

守护进程使用不同的外部源(我认为细节不重要)并创建新对象:

newTemp = Measurement.new
# set values ...
newTemp.save

2 个答案:

答案 0 :(得分:4)

我认为你需要使用它,正如文档所说:

从Rails应用程序内的任何位置向频道广播。现有控制器,模型,后台作业或新的WebsocketRails控制器。

latest_post = Post.latest
WebsocketRails[:posts].trigger 'new', latest_post

检查出来: Documentation

答案 1 :(得分:1)

守护进程应该通过控制器界面发布新的温度对象,就像常规的Web请求一样。直接访问对象(而不是通过控制器)会破坏MVC模式。

我的建议是在trigger_value:float中实施triggered?:booleanTemperature属性。

  • (控制器,保存前)将触发器值和温度守护程序数据传递给新的Temperature对象。

  • (模型,保存期间)计算温度值是否超过触发值;相应地设置triggered?布尔值。

  • (控制器,保存后)创建后,读取triggered?布尔值;如有必要,将消息发布给客户。