【问题标题】:Rails Polymorphism for User modeling用于用户建模的 Rails 多态性
【发布时间】:2016-09-02 16:08:50
【问题描述】:

我是 Rails 5 的新手,我正在尝试使用 Devise 和 CanCanCan 对以下场景进行建模:商店应用程序。 相关人物有:Admin、StoreManager、StoreOfficer、Customer、Technician。

  • 管理员创建 StoreManager。
  • StoreOfficer 可以创建客户信息来注册新客户。
  • StoreOfficer 可以查看所有客户的完整列表以及相关信息
  • StoreOfficer 可以查看所有技术人员的完整列表以及相关信息
  • StoreManager 可以看到所有 StoreOfficer 的完整列表以及相关信息
  • StoreManager 可以让 StoreOfficer 使用系统并编辑他们的信息
  • StoreManager 可以让 StoreOfficers 创建的客户使用系统
  • StoreManager 可以看到所有客户的完整列表以及相关信息

还有一些其他的路径,但我可以在这些案例完成后开发它们。

有什么帮助/教程吗?

谢谢, FZ

【问题讨论】:

  • 如果您按照railsdevisecancancan 的文档展示到目前为止您已完成的工作,您会得到更快的回复。并解释你到底在哪里卡住了,包括代码示例和相关的错误信息。
  • 如果我仍然需要了解哪种方法更好地开发这样的模式,我该如何发布一些代码示例?我有以下事实: 1- admin 管理一切,并有一个progressiveid、lastname、secondname 和sex 作为字段。 2- StoreManagers 具有与 admins 相同的字段,StoreOfficers 具有与 admin 相同的字段加上对他的老板的 id 的引用,他是 StoreManager。 3- 客户具有与管理员相同的字段以及对注册他的 StoreOfficer 的 ID 的引用。 4- 客户不登录系统,而是由特定的StoreOfficer注册。
  • 说了,我应该使用STI还是多态关联? devise/cancan 是否会干扰 STI 或多态性关联?我是否将命令rails generate devise User 应用于用户类,或者我必须为我需要的每个用户角色(管理员类、StoreOfficer 类、StoreManager 类)创建一个不同的类?

标签: authentication devise authorization ruby-on-rails-5 cancancan


【解决方案1】:

在尝试了一些不同的事情后,我创建了以下令人满意的架构,我将其发布在这里供其他人使用,以便他们可以使用可靠的东西:

Class User<ApplicationRecord
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

    belongs_to :userable, polymorphic: true
end

然后是所有其他角色类,类似于以下:

class Customer < ApplicationRecord
    belongs_to :technician
    belongs_to :store_officer

    has_one :user, as: :userable, dependent: :destroy
    has_one :address, as: :addressable, dependent: :destroy

    accepts_nested_attributes_for :user, :address
end

因此,我在数据库中使用迁移创建了所有需要的字段。 然后我在每个控制器中输入代码before_action :authenticate_user!

稍微填充数据库后,我现在可以使用 rake db:seed 插入的不同用户登录。

这是我的 routes.rb 文件:

Rails.application.routes.draw do
    devise_for :users
    resources :store_managers
    resources :store_officers
    resources :items
    resources :technicians
    resources :customers
    resources :addresses
    resources :users
    # For details on the DSL available within this file, see     http://guides.rubyonrails.org/routing.html
end

你们觉得这个设置怎么样? 现在我想将 CanCanCan 介绍给我的项目。请验证我将要执行的以下步骤:

  1. 运行rails g cancan:ability
  2. 将所有规则放入ability.rb文件中:

    if user.admin?
      can :manage, :all
    elsif user.store_manager?
      can :read, Customer
      can :create, Customer
      can :update, Item do |item|
        item.try(:user) == user
      end
      can :destroy, Item do |item|
        item.try(:user) == user
      end
    elsif user.store_officer?
      can :read, Customer
    end
    .
    .
    .
    
  3. 在 user.rb 模型中创建方法来检查角色:

    def customer?
      self.userable_type == Customer
    end
    
  4. 在每个控制器中放入load_and_authorize_resource

您认为这种方法正确吗?或者也许我应该将方法/定义放在其他文件中?

谢谢, FZ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2014-01-23
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多