2

以下に掲載されているコントローラーから index メソッドをスケジュールできますか? もしそうなら、どうすればそれを行うことができますか?

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

あなたはNumberモデルを持っているようです。最初のステップは、ロジックをコントローラーからモデルに移動することです。

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 に答える