首次设置延迟作业,并且在执行此RailsCast后,它在我的测试环境中无法正常工作。
我有两种方法可以运行 - 在测试中,我希望在页面加载后15秒运行它们。这些方法来自 Participation.rb 模型中的calculate_rankings
和update_wallet
。
根据上面的指南安装gem后,我正在尝试调试两件事:1)我正在运行rake jobs:work
,Starting job worker
之后没有输出,2)我添加了一个警告我的控制器的方法,它不会激活。
post-gem安装和运行迁移(成功),我在代码中做了两处更改。
这是错误。该文件名称不正确,因此未在控制器中正确调用。它应该是 app / jobs / chips_update_job.rb ,基于我在下面写的方法。
class ChipsUpdaterJob < Struct.new(:game_id)
def perform
Participation.calculate_ranking(game_id)
Participation.update_wallet(game_id)
end
end
更新了我想要初始化延迟作业的 ScoreboardController :
class ScoreboardController < ApplicationController
def index
@participations = Participation.where(finished: true, game_id: session[:game_id]).order(score: :desc).limit(10)
@game = Game.find(params[:game_id])
end
def chipsupdater
Delayed::Job.enqueue(ChipsUpdaterJob.new(params[:game_id]), :run_at => 1.minute.from_now)
flash[:notice] = "Things are good. Not broken."
end
end
在作业控制台中没有闪光警报或输出,我的信念是我没有正确地调用延迟作业。你能发现我出错的地方(或者为什么我不能使用作业控制台进行调试)?
修改
根据评论中的讨论,我现在正在测试环境中运行worker。但是,我仍然未能a)将作业发布到我的DelayedJobs
表或b)实现我们的密钥输出,即使用ChipsUpdater作业文件中的两个方法。
因此,我的信念是,我未能根据此失败正确地调用延迟的工作。
对于上下文,我想要包含两个可能相关的文件。
首先,这是ChipUpdaterJob
:
class Participation < ActiveRecord::Base
ef self.calculate_ranking(game_id)
records = Participation.where(game_id: game_id, finished: true).order('score DESC, updated_at ASC')
records.each_with_index do |record, index|
puts "rank: #{index + 1}"
puts record.inspect
puts record['score']
puts record['user_id']
puts record['game_id']
Ranking.create(game_id: game_id, user_id: record['user_id'], game_time: record['updated_at'], ranking: index + 1)
end
end
如果这是从延迟上下文中取出并从记分板控制器作为常规方法运行,我已在本地确认它成功运行了排名过程。延迟似乎是失败。
/ bin / delayed_job
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
require 'delayed/command'
Delayed::Command.new(ARGV).daemonize
答案 0 :(得分:2)
如果您尝试在测试环境中运行作业,则需要在运行rake命令时设置该环境
RAILS_ENV=test bundle exec rake jobs:work
另外,请尝试打印而不是使用闪光灯通知。从
运行作业的选项卡上可以看到更多的打印件你可以确认你在一次测试中确实要去chipsupdater
路线吗?
答案 1 :(得分:0)
您是否已将此行添加到config / application.rb
config.active_job.queue_adapter = :delayed_job