2
Post: hidden: boolean

我希望登录用户可以看到所有帖子,而未登录用户只能访问隐藏字段为假的帖子。所以我在cancan的能力模型中是这样写的:

if user_signed_in?
    can :read, Post
else 
    can :read, Post, :hidden => false
end

但模型中不允许访问帮助程序 user_signed_in。正如这个问题所述:Rails 3 devise, current_user is not access in a Model ?. 虽然我们可以使用一些技巧来访问帮助程序,但这样做是不合适的

那么,如何正确授权未登录的用户呢?或者只是使用“包含”来使用这个助手??

或者我应该把它放在身份验证部分?但如何?

4

1 回答 1

4

您需要做的就是:

def initialize(user)
  user ||= User.new # guest user (not logged in)

  can :read, Post, :hidden => false

  if User.exists?(user)
    can :read, Post
  end
end

使用 devise,current_userhelper 方法在登录时返回当前用户,但在未登录时返回 nil。它在控制器和视图中可用。默认情况下,CanCan 会针对current_user方法的返回执行所有授权检查。

现在,每当can?从视图或控制器调用该方法时,返回的current_userAbility作为局部变量传递给 的新实例user

要检查用户是否已登录,我选择使用User.exists?(). 这是一个类方法,用于ActiveRecord::Base检查该user对象是否保留在数据库中。任何其他方式都可以。例如,这将同样有效或更好:

if user.encrypted_password
  can :read, Post
end

这将检查user实例的默认设计密码字段是否存在。如果您没有做任何太疯狂的事情,这只会在用户登录时返回一个值。如果第二个选项适用于您的情况,它可能会更好,因为您甚至不必查询数据库。

半相关提示,查看像Rolify这样的角色处理宝石。与 CanCan 结合使用时非常棒。

于 2013-02-01T03:46:13.457 回答