所以我正在做的是我有一个rake任务,每天都会减少订阅的剩余时间。这是rake任务:
namespace :delete do
desc 'Remove a day for premium subscription days left'
task :premium_subscription_remove => :environment do
PremiumSubscription.find_each do | premium_subscription|
premium_subscription.premium_subscription_days_left -= 1
premium_subscription.save
end
end
end
此rake任务将倒计时订阅的剩余天数。现在我创建了一个新模型,它将处理零点后剩下的日子。一旦达到零,代码将导致订阅自动续订。以下是续订的代码:
def self.renew_premium_subscription(user, premium_subscribe)
if premium_subscribe.premium_subscription_days_left <= 0
user.premium_subscriptions.where(:premium_subscribe_id => premium_subscribe.id).destroy_all
if user.points >= premium_subscribe.premium_subscription_cost
user.premium_subscriptions.where(:premium_subscribe_id => premium_subscribe.id).first_or_create
user.points = user.points - premium_subscribe.premium_subscription_cost
user.save
end
end
end
我遇到的问题是premium_subscription_days_left为负2且从未采取过renew_premium_subscription。我尝试输入随机字母,模型没有发现错误。为了更新,该模型如何采取行动?我把代码放在控制器中:
def renew_subscription
PremiumSubscription.renew_premium_subscription(current_user, @user)
end
但那根本没有用。如果有人知道如何使这个东西工作,那将是伟大的。谢谢你的帮助:)
编辑:尝试将更新功能放在rake任务中,但这根本不起作用。
编辑2:没有这样的运气来解决这个问题。有人有线索吗?
编辑3:所以我虽然有些事情,有没有办法自动调用模型类。我只需要让这件事起作用。
以下是我所做的概述:
创建了一个rake任务。无论何时倒数为零,都会调用此rake任务。
我在premiumSubscription模型中创建了一个模型,该模型说明当它达到零时,它将更新订阅或销毁它。
我已将计数设置为零,刷新页面但订阅未更新或销毁。
编辑4:所以我了解到控制器需要由路由触发。有没有办法在页面加载时触发此代码?
答案 0 :(得分:0)
几点说明:
user.save
这可能会失败。如果save
不成功,则会返回false
。您的方法不会测试返回值,因此不会注意到不成功的保存 - 没有任何内容写入日志文件,也不会引发错误,nada。检查save
的结果或致电save!
,这将引发异常。
premium_subscription.premium_subscription_days_left -= 1
您可能有充分的理由存储此值,但您还应考虑存储开始日期(或到期日期),并计算给定当前日期的剩余天数。减少“剩余的天数”要求cron作业在应该运行时...如果它错过了一天,则计数将关闭。