我在我的应用程序上安装了Devise gem。我的应用程序中也有几个帖子模型。例如,我有一个帖子模型供人们讨论各种微型模型中的“篮球”,“棒球”和“足球”。
但是,我想根据他们在使用Devise注册时提供的信息限制某些用户在某些模型中发布。例如,要在Basketball模型中发布,您必须提供邮政编码04583,34039或49492.否则,用户将无法发布。
这可能吗?我认为它原本可以用CanCan宝石,但现在我不确定。
谢谢!
注意不要将身份验证与授权混淆。设计用于身份验证,即用户就是他所说的人。你想要的是一种授权某些用户做某些事情的方法。
康卡斯宝石是一种很好的方法,但已经被cancancan取代,它将完全符合您的要求。查看wiki关于定义能力以更好地了解这是如何完成的。
请注意,您的授权方法完全独立于Devise,但您仍然可以使用您希望的用户的任何属性,即使它们是通过注册表单获得的。
首先,身份验证/授权将在您的控制器中进行,而不是在您的模型中进行。根据适当的MVC架构,您的模型并不关心谁是谁。
要添加授权(我假设您已经处理过身份验证),您可以在ApplicationController
中添加这样的内容:
def require_whatever_privilege
unless <whatever your criteria is>
# Option 1 – Raise a routing error:
raise ActionController::RoutingError.new("You don't have access to this!")
# Option 2 – Render a 403 page, if you have one:
return render file: 'public/403.html', status: :forbidden
end
end
然后,您只需将过滤器添加到要在其中使用的控制器中:
before_action :require_whatever_privilege
或者,如果您只想在控制器上使用特定方法的过滤器,则可以执行以下操作:
before_action :require_whatever_privilege, only: :index