情况:带有演示期的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
,在每个请求上检查用户的付款状态并相应地重定向它们(在主页/配置文件编辑等地方跳过此内容),但是我认为必须有一个更好的方法,因为它正在迅速变得过于复杂,并且在应用程序控制器中具有所有这些复杂性感觉是错误的。我一直在寻找像cancan这样的用户角色库,但我找不到合适的东西。
答案 0 :(得分:3)
Jonas Nicklas(Capybara和CarrierWave的创建者)发表了一篇文章,其中详细解释了如何采用比CanCan更简单的方法。他的方法基于为每个要为其创建授权规则的模型的附加普通Ruby类。
Simple authorization in Ruby on Rails apps (Elabs blog)
他们已经将该解决方案卸载到名为Pundit的gem中,但它看起来非常简单,能够从头开始实现。
答案 1 :(得分: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 => ...
。