我目前正在开发一款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
答案 0 :(得分:4)
我认为你需要使用它,正如文档所说:
从Rails应用程序内的任何位置向频道广播。现有控制器,模型,后台作业或新的WebsocketRails控制器。
latest_post = Post.latest
WebsocketRails[:posts].trigger 'new', latest_post
检查出来: Documentation
答案 1 :(得分:1)
守护进程应该通过控制器界面发布新的温度对象,就像常规的Web请求一样。直接访问对象(而不是通过控制器)会破坏MVC模式。
我的建议是在trigger_value:float
中实施triggered?:boolean
和Temperature
属性。
(控制器,保存前)将触发器值和温度守护程序数据传递给新的Temperature
对象。
(模型,保存期间)计算温度值是否超过触发值;相应地设置triggered?
布尔值。
(控制器,保存后)创建后,读取triggered?
布尔值;如有必要,将消息发布给客户。