Post: hidden: boolean
我希望登录用户可以看到所有帖子,而未登录用户只能访问隐藏字段为 false 的帖子。
所以我在cancan的能力模型中这样写:
if user_signed_in?
can :read, Post
else
can :read, Post, :hidden => false
end
但模型中不允许访问助手 user_signed_in 。
正如这个问题中所述:Rails 3 设计,模型中无法访问 current_user ? https://stackoverflow.com/questions/3742785/rails-3-devise-current-user-is-not-accessible-in-a-model#3742981。虽然我们可以使用一些技巧来访问帮助程序,但这样做是不合适的
那么,如何才能正确授权未登录的用户呢?或者只是使用“包含”来使用这个助手?
或者我应该把它放在身份验证部分?但如何呢?
您需要做的就是:
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
通过设计,current_user
helper 方法在登录时返回当前用户,但在未登录时返回 nil。它在控制器和视图中可用。默认情况下,CanCan 对返回的内容进行所有授权检查current_user
method.
现在每当can?
从视图或控制器调用方法,返回current_user
将被传递到一个新实例Ability
作为局部变量user
.
要检查用户是否已登录,我选择使用User.exists?()
。这是一个类方法ActiveRecord::Base
这将检查是否user
对象持久化在数据库中。任何其他方式也同样有效。例如,这会同样有效甚至更好:
if user.encrypted_password
can :read, Post
end
这将检查默认设备密码字段是否存在user
实例。如果您没有做任何太疯狂的事情,则只有在用户登录时才会返回一个值。如果第二个选项适合您的情况,它可能会更好,因为您甚至不必查询数据库。
半相关提示,查看角色处理宝石,例如Rolify https://github.com/EppO/rolify。与 CanCan 结合使用效果非常好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)