ruby-on-rails - rails 4.2 : Role Based Auth and Separate Attributes

标签 ruby-on-rails authentication devise authorization table-relationships

我正在创建一个包含 3 种类型用户的应用程序,最终可能会出现第四种用户......

  • 管理员
  • 提供商
  • 成员(member)(患者)

棘手的部分是每个共享一些共同的属性,例如“first_name”和“last_name”,但会有更多不同的属性。如果它们都共享相同的“用户”表,我将有太多的“nil”列,这感觉不是一个好的做法。

解决这个问题的好方法是什么?有没有办法建立基于角色的模型关系?

我的计划是使用 Devise 和 Pundit、Postgres for DB。

最佳答案

对所有用户类型使用单个模型/表,对管理员/提供者/成员使用角色属性。然后,您可以对所有角色使用相同的登录表单,并且无需在每次添加新角色时添加更多表和模型。

我建议查看 CanCanCan gem https://github.com/cancancommunity/cancancan 。您可以根据角色授权用户操作。

# app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.role == "admin"
      can :manage, :all
    elsif user.role == "provider"
      can :manage, SomeModel, user_id: user.id
    elsif user.role == "member"
      can :read, SomeModel
      can :read, SomeOtherModel
    end
  end
end

如果您希望每个角色使用不同的表单字段,只需为这些字段使用部分模板即可。

# app/views/users/_form.html.erb
<%= form_for @user do |f| %>
  <%= f.text_field :first_name %>
  <%= f.text_field :last_name %>
  <%= render "#{@user.role}_fields", f: f %>
<% end %>

# app/views/users/_admin_fields.html.erb
<%= f.text_field :some_field_for_admins_only %>

关于ruby-on-rails - rails 4.2 : Role Based Auth and Separate Attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314934/

相关文章:

java - Spring安全登录总是200

ruby-on-rails - 如何手动发送 Devise 邮件?

ruby-on-rails - 错误 : Failed to build gem native extension

ruby-on-rails - 从多个地方渲染 javascript : The Rails way

angularjs - 身份验证后不会调用卫星器

sql - 基于用户的数据访问

subdomain - 关于使用用户名和子域的用户身份验证

ruby-on-rails - Ruby on Rails 4 什么时候设计调用 require_no_authentication 方法?

ruby-on-rails - 如何从 Rails 中的时间中提取日期部分?

jquery - 如何在 Rails 中发布一个数组