如何在 Rails 应用程序中为我的用户添加角色?

Posted

技术标签:

【中文标题】如何在 Rails 应用程序中为我的用户添加角色?【英文标题】:how to add roles to my users in rails app? 【发布时间】:2015-11-16 11:47:51 【问题描述】:

我有一个简单的应用程序,带有来自 devise 的身份验证系统。我尝试将角色添加到用户模型。但是什么也没发生。

我所做的是 创建角色模型并将其链接到用户模型:

$ rails g model Role name:string
$ rails g migration addRoleIdToUser role:references
$ rake db:migrate

(按照设计 wiki 的指示)

然后在我的模型中:

class User < ActiveRecord::Base
  belongs_to :role
end
class Role < ActiveRecord::Base
  has_many :users
end

使用我的角色设置 seed.rb:

['seller', 'buyer', 'admin'].each do |role|
  Role.find_or_create_by(name: role)
end

那么

$ rake db:seed

就是这样。而且我还想知道如何让用户在注册时选择这些角色中的任何一个

【问题讨论】:

【参考方案1】:

首先,您可以在用户类中使用enum,而不是使用关联:

class User < ActiveRecord:Base
   enum role: seller: 0, buyer: 1, admin: 2

   ... 
end

您需要迁移才能将role(整数)列添加到用户表中。

在您的终端中:

rails g migration add_role_to_users

然后编辑迁移文件:

class AddRoleToUsers < ActiveRecord::Migration
   def change
      add_column :users, :role, :integer
   end
end

然后你可以例如使用SimpleForm gem 让用户在注册时选择他/她的角色:

<%=  simple_for for @user do |f| %>
   ...
   <%= f.select :role, collection: User.roles.keys.to_a %>
   ... 
<% end %> 

但 SimpleForm 也适用于关联:

<%= f.association :role, as: :radio_buttons %>

有更多的关联示例here。

【讨论】:

嘿@zhurora 对不起这个愚蠢的问题,但你能告诉我我需要什么迁移 我添加了迁移。当您在使用它时发现任何错误时,请随时编辑答案,因为我没有检查我的代码。 嘿@zhurora 非常感谢你,每件事都运行良好,但是当我检查我的控制台时出现一个问题,它说角色 id 是 nil 我现在想使用 cancancan,为此我必须关联用户的角色 ID 你能帮我吗 Cancancan 不应该强迫您选择管理角色的方式(通过枚举或关联)。观看thisRailsCast,之后您应该可以使用 Cancancan。 意味着使角色ID与用户正确关联并不重要......现在它在控制台中显示角色ID为零......可以吗? @zhurora【参考方案2】:

虽然您可以像以前那样向应用程序添加角色。但是,处理所有类型的角色及其职责将是一项艰巨的工作。还, 有几个不错的 gem,例如 pundit 和 cancan,可用于处理应用程序用户的授权。它们很容易与您的 Rails 应用程序集成,并且可以很好地与您已经在使用的身份验证 gem devise 配合使用。

这是一个很好的 video tutorial,它显示了 Pundit 的 Rails 授权。

【讨论】:

以上是关于如何在 Rails 应用程序中为我的用户添加角色?的主要内容,如果未能解决你的问题,请参考以下文章

在 Sprite Kit 中为我的角色设置动画?

如何从联系人快捷菜单中为我的应用程序添加链接

如何在 Ruby on Rails 4 中为 post 生成唯一的随机 id?

如何在 Rails 中为博客创建单独的管理界面

我正在尝试在 discord.js 中为我的机器人创建一个自动角色功能,但它不起作用

如何在rails 5中为现有模型添加外键