如何每隔一天运行ruby / javascript代码?

时间:2018-03-12 03:30:05

标签: javascript ruby sinatra haml

我试图建立一个我在网上找到的自动浇水系统,此时泵只在用户按下启动时运行,在用户按下停止时停止。我想让它每两天运行一次。我不确定是否需要将其放入我的javascript水泵文件或我的ruby Sinatra应用程序脚本中。我尝试过使用发条,每当宝石出现时,我认为我的语法错误,我试着把它放在app.rb中的CLIENT.publish上。同样在教程中我跟随创建者说要将正确的参数添加到app.rb文件中的末尾CLIENT.publish('pump/data', {state:{pump: params['action']}}.to_json)。我也试过在water-pump.js中做setInterval,但不确定如何做。我还没有对index.haml文件做任何事情,我需要在.pump-control中放一些东西。如果您想查看它https://www.hackster.io/demirhanaydin/waterpi-houseplant-remote-watering-and-monitoring-system-340400

,这是教程

这是我的water-pump.js文件

function takeAction() {
  var button = $('#pumper'),
      action = $('#action_input').val();

  $('#action-form').trigger('submit');

  if (action == 'start') {
    $('#action_input').val('stop');
    button.text('stop');
  } else {
    $('#action_input').val('start');
    button.text('start');
  }
}

$(document).ready(function() {
  $('#action-form').submit(function(event) {
    event.preventDefault(); // Prevent the form from submitting via the browser
    var form = $(this);
    $.ajax({
      type: form.attr('method'),
      url: form.attr('action'),
      data: form.serialize()
    }).done(function(data) {
      // Optionally alert the user of success here...
    }).fail(function(data) {
      // Optionally alert the user of an error here...
    });
  });
});

这是我的app.rb

# app.rb
require 'sinatra'
require './boot'


set :sessions, true
set :session_secret, SESSION_SECRET

enable :sessions

get '/' do
  haml 'welcome/index'.to_sym
end


post '/take-action' do
  CLIENT.publish('pump/data', {state:{pump: params['action']}}.to_json)
  200
 end

这是我的index.haml文件

%head
  %script{type: "text/javascript", src: url('javascripts/jquery.min.js')}
  %script{type: "text/javascript", src: url('/javascripts/water-pump.js')}
  %iframe{:align => "center",:height => "450", :src => "https://app.redash.io/taylor/embed/query/76316/visualization/132291?api_key=EfPwD8WgLKybMagKriu7JrLFXvYWpVVQrV5g0qqp", :width => "820",:style => "float:left;margin-top:30px;"}
  %link{rel: :stylesheet, type: :"text/css", href: url('/stylesheets/default.css')}
#container
  #synchronized
  .gauge
    #container-speed
    .pump-control
      %form{method: :post, action: '/take-action', id: 'action-form' }
        %input{type: 'hidden', name: 'action', value: 'start', id: 'action_input'}
        %span{:align => "center",id: 'pumper', onclick: 'takeAction()'}
          start

1 个答案:

答案 0 :(得分:0)

您最好的办法是使用cron job来安排系统。

  • 安排您的cron作业每X小时/分钟运行一次(对您的系统而言是合理的)
  • 配置您的cron作业以执行命中API端点的脚本或直接查询数据库。检查需要停止或启动的任何浇水作业并执行它们。

我建议使用cron或其他值得信赖的调度系统,因为依赖于长时间运行的应用程序来保持计划是危险的。它也被认为是一种很好的设计,可以构建仅擅长一件事的组件,以便您可以单独测试它们。