情况:rails 3.2 app有一个演示期,之后用户必须开始为服务付费。
问题:如果用户未添加付款方式,或未选择付款方案,那么限制用户访问网络应用的“付费”部分的建议方法是什么?
我需要对用户进行排序的内容如下:
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
,它在每个请求上检查用户的付款状态并相应地重定向它们(在主页/配置文件编辑等地方跳过这个),但我认为必须有一种更好的方法,因为它很快变得太复杂,并且在应用程序控制器中具有所有复杂性时感觉不对。 我一直在寻找像康康那样的用户角色库,但我找不到合适的东西。
Jonas Nicklas(Capybara和CarrierWave的创建者)发表了一篇文章,其中详细解释了如何采用比CanCan更简单的方法。 他的方法基于为要为其创建授权规则的每个模型的附加普通Ruby类。
Ruby on Rails应用程序中的简单授权(Elabs博客)
他们已将该解决方案卸载到名为Pundit的gem中,但它看起来非常简单,能够从头开始实现。
我建议在应用程序控制器中使用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 => ...
在过滤器本身上:except => ...