如何在 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 应用程序中为我的用户添加角色?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ruby on Rails 4 中为 post 生成唯一的随机 id?