我在我的应用程序中添加了对订阅的支持。
我希望它的工作方式是用户从免费帐户开始,并可以切换到高级帐户。这将自动续订,但如果用户停止付款或取消订阅,将在月底停止。
我对如何使其工作感到困惑,我不太清楚如何处理它。
我为用户配置了使用cancan的权限。
来自models/user.rb
:
ROLES = [:admin, :premium, :free]
def roles=(roles)
self.roles_mask= (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
end
def roles
ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
end
def has_role?(role)
roles.include? role
end
def has_one_of_roles?(roles_array)
not (roles & roles_array).empty?
end
def upgrade_plan (role)
return false unless ROLES.include? role
self.roles = [ role ]
self.save
end
我有一个订阅控制器controllers/subscription_controller.rb
:
def create
@subscription = Subscription.new(params[:subscription])
@subscription.user_id = current_user.id
@subscription.expiration_date = 1.month.from_now
respond_to do |format|
if @subscription.save
if current_user.upgrade_plan :premium
format.html { redirect_to trades_path, notice: 'Subscription was successfully created. Compliments you are now subscribed to the premium plan' }
format.json { render json: trades_path, status: :created, location: @subscription }
else
format.html { redirect_to home_pricing_path, notice: 'Error while upgrading your account, please contact us' }
format.json { render json: home_pricing_path, status: :created, location: @subscription }
end
else
format.html { render action: "new" }
format.json { render json: @subscription.errors, status: :unprocessable_entity }
end
end
end
虽然在我看来在数据库中订阅有点多余,但仍然只检查用户角色。
另外,通过这种方式,我应该在每次请求时检查订阅的有效性,这样我就可以在用户角色过期时更新它,这似乎太重了。
你会如何应对这种情况?
谢谢,
答案 0 :(得分:4)
您不需要在每个请求上检查订阅,因为到期是基于时间的,您需要为到期订阅创建rake任务并将其添加到服务器上的cron以便每天调用一次。
您可以阅读自定义佣金任务here。
答案 1 :(得分:2)
我最近也实施了付费专区,我有以下建议。
希望这有帮助。
更新:2014年3月18日 我意识到你的主题是指设计。你有更具体的问题吗?我的实现也涉及Devise,所以也许我可以提供更有针对性的建议。