【问题标题】:Why is Pundit not coupled with Rolify like CanCanCan is?为什么 Pundit 不像 CanCanCan 那样与 Rolify 结合使用?
【发布时间】:2014-10-03 01:40:06
【问题描述】:

我正在使用 Devise,并且对使用 Pundit 很感兴趣,但我找不到太多关于它是否应该与 Rolify 集成或它是否独立的信息。 CanCanCan 与 Rolify 配合得很好,我喜欢角色模型。我是否错过了 Pundit 和 Rolify 似乎没有经常一起使用的主要原因?

【问题讨论】:

  • Pundit 可以很好地与 Rolify 或任何其他角色系统配合使用。
  • @sevenseacat 这也是正确答案

标签: ruby-on-rails-4 devise cancan rolify pundit


【解决方案1】:

为什么不一起使用它们呢?它们可以以这样的方式轻松使用

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 没有耦合是一件好事,而不是设计失败;)

【讨论】:

    【解决方案2】:

    我最近使用 devise 将 Pundit gem 与 Rails 4 一起使用。根据我的经验,Pundit 是独立系统,不依赖于 Rolify。

    我没有使用 Rolify,而是创建了迁移以在现有的设计用户表中添加角色,这有助于您将角色分配给用户并检查他们拥有哪些角色。

    请查看我为我的项目创建的架构:

     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 字段。

    希望这会有所帮助!

    【讨论】:

    • 这会起作用,但它不可扩展。假设您想添加一个 is_premium 用户。您将不得不更改您的数据库模型。而是创建属于您自己的模型 UserRole(:id, :role_name) ,您可以在其中为每个用户创建任意数量的角色名称...不过,我选择了 Rolify gem ;)
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2012-05-12
    • 2011-05-13
    相关资源
    最近更新 更多