3

情况:带有演示期的 rails 3.2 应用程序,之后用户必须开始为服务付费。

问题:如果用户没有添加支付方式,或者没有选择支付计划,那么限制用户访问网络应用程序“付费”部分的推荐方法是什么?

我需要对用户进行如下排序的东西:

if user.admin? || user.in_demo || user.has_all_payment_data
  # carry on
elsif user.should_add_payment_method
  # send them to add payment method page
elsif user.should_choose_plan
  # send them to add plan
else
  # redirect to home page or whatever
end

我已经开始before_filter在应用程序控制器上检查每个请求的用户付款状态并相应地重定向它们(在主页/配置文件编辑等地方跳过这个),但我认为必须有一个更好的方法,因为它很快变得过于复杂,并且在应用程序控制器中拥有所有这些复杂性感觉是错误的。我一直在寻找像 cancan 这样的用户角色库,但我找不到任何合适的东西。

4

2 回答 2

3

Jonas Nicklas(Capybara 和 CarrierWave 的创建者)发表了一篇文章,其中详细解释了如何采用比 CanCan 更简单的方法。他的方法基于一个额外的普通 Ruby 类,用于为您要为其创建授权规则的每个模型。

Ruby on Rails 应用程序中的简单授权(Elabs 博客)

他们已经将该解决方案卸载到一个名为 Pundit 的 gem 中,但它看起来真的很简单,可以从头开始实施。

权威宝石(GitHub)

于 2013-05-16T23:06:10.593 回答
1

我建议before_filter在应用程序控制器中使用一个,然后skip_filter在单个控制器中使用它来绕过它以进行非付费用户可以访问的操作,例如:

class ApplicationController < ActionController::Base
  before_filter :check_payment
  ...
end

class UserController < ApplicationController
  skip_filter :check_payment, :only => [:login, :logout, ...]
  ...
end

这保持了对相关控制器的访问,而不是需要越来越大:except => ...的过滤器本身。

于 2013-05-16T15:00:55.740 回答