为什么Pundit没有像CanCanCan一样与Rolify耦合?

10

我正在使用Devise,对使用Pundit感兴趣,但找不到很多关于它是否应该与Rolify集成的信息。CanCanCan与Rolify很好地配合,我喜欢角色模型。我是否忽略了Pundit和Rolify不经常一起使用的重要原因?


7
Pundit 可以很好地与 Rolify 或任何其他角色系统配合使用。 - sevenseacat
1
@sevenseacat 这也是一个正确的答案。 - MicFin
2个回答

45
为什么不把它们一起使用呢?可以轻松地像这样使用。
class OrganisationPolicy
  def initialize(user, organisation)
    @user = user
    @organisation = organisation
  end

  def index?
    @user.has_role? :admin
  end

  def show?
    @user.has_role?(:admin) || @user.organisation == @organisation
  end
end

事实上,rolifypundit没有耦合是一件好事情,而不是设计上的失败 ;)


1
我最近在Rails 4中使用了Pundit gem和devise。根据我的经验,Pundit是一个独立的系统,不依赖于Rolify。
我没有使用Rolify,而是创建了迁移来向现有的devise用户表添加角色,这有助于为用户分配角色并检查他们拥有哪些角色。
请查看我为项目创建的模式。
 create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    **t.boolean  "is_admin"
    t.boolean  "is_daily_user"

为用户角色添加了is_adminis_daily_user字段。

希望这可以帮助您!


5
这个方案可行,但不具有可扩展性。想象一下,如果你想添加一个“高级用户”(is_premium user),你将不得不更改数据库模型。相反地,创建自己的模型 UserRole(:id, :role_name),它属于用户(belongs_to user),您可以为每个用户创建任意数量的角色名称...我使用了 Rolify gem(宝石) ;) - luigi7up

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接