2

我可以从下面发布的控制器安排索引方法吗?如果是这样,我将如何去做?

class WelcomeController < ApplicationController
  def index
   if Number.find(1)
    @number = Number.first
    @number.value += 1
    @number.save
   else 
    @number = Number.new    
    @number.value = 0
   end
  end
end
4

2 回答 2

2

所以你似乎有一个数字模型。第一步是将您的逻辑从控制器移动到模型:

class Number

  def self.increment

    n = nil

    if Number.find(1)
      n = Number.first
      n.value += 1
      n.save
    else
      n = Number.new
      n.value = 0
    end

    n
  end
end

然后你的控制器变成

class WelcomeController < ApplicationController

  def index

    @number = Number.increment
  end
end

然后这个“增量”类方法也可以从调度程序中调用。像:

# file:
# config/initializers/scheduler.rb

require 'rufus-scheduler'

# Let's use the rufus-scheduler singleton
#
s = Rufus::Scheduler.singleton


# Stupid recurrent task...
#
s.every '10m' do

  Number.increment
end

现在,如果这个答案也超出您的想象,请考虑注册 Rails 开发人员课程。请意识到人们是来帮助你的,而不是免费做你的工作。

于 2014-03-11T04:25:39.887 回答
0

首先你需要初始化一个 rufus-scheduler 实例。这通常在 Rails 初始化程序中完成:

# config/initializers/scheduler.rb

require 'rufus-scheduler'

# Let's use the rufus-scheduler singleton
#
s = Rufus::Scheduler.singleton

# Stupid recurrent task...
#
s.every '1m' do

  Rails.logger.info "hello, it's #{Time.now}"
end

然后,您的控制器可以使用 rufus-scheduler 实例,如下所示:

class ScheController < ApplicationController

  def index

    job_id =
      Rufus::Scheduler.singleton.in '5s' do
        Rails.logger.info "time flies, it's now #{Time.now}"
      end

    render :text => "scheduled job #{job_id}"
  end
end

这适用于 Webrick 和 Thin,但需要对 Passenger 或 Unicorn 进行一些调整(防止多个调度程序和/或防止初始 rufus-scheduler 线程消失)。

于 2014-03-11T01:16:57.463 回答