Ruby on rails 绕过对标记为public的特定记录设计授权的最佳方法是什么

Ruby on rails 绕过对标记为public的特定记录设计授权的最佳方法是什么,ruby-on-rails,devise,cancan,Ruby On Rails,Devise,Cancan,我正在Rails 3.2项目中使用Desive和cancan。我有一个带有 布尔标志公共。如果事件标记为public=>true,则我希望任何人,无论是否登录,都能够使用访问记录 GET /events/:id 如果标记为public=>false,则一系列cancan能力将决定对上述资源的授权和访问 实现这一点的最佳模式是什么?您可以通过跳过用户身份验证来做到这一点!如果你有这个args skip_before_filter :authenticate_user!, :only =>

我正在Rails 3.2项目中使用Desive和cancan。我有一个带有 布尔标志公共。如果事件标记为public=>true,则我希望任何人,无论是否登录,都能够使用访问记录

GET /events/:id
如果标记为public=>false,则一系列cancan能力将决定对上述资源的授权和访问


实现这一点的最佳模式是什么?

您可以通过跳过用户身份验证来做到这一点!如果你有这个args

  skip_before_filter :authenticate_user!, :only => :show, :if => lambda { 
    if params[:id]
      @event = Event.find(params[:id])
      @event and @event.public?
    else
      false
    end
  }

否,不要跳过身份验证。您想跳过授权。更好的解决方案是使用public=>true显式授权事件

在您的cancan能力课程中:

can :read, Event do |e|
  some_other_authorization_boolean || e.public?
end

这种能力将给予所有用户;即使是未登录的资源。

实际上,参数是资源中的一个字段,但现在我想我当然可以在lambda中加载资源并检查该字段。参数[:id]是资源标识符,如果资源被标记为公共,则不需要身份验证。你能推荐另一种方法吗?这个解决方案似乎不受欢迎。检查此项:。如果不跳过身份验证,则会返回到注册屏幕。只有在设计验证有机会取消筛选链后,才能进行CANCAN授权。