我们如何列出所有主题角色?:管理员,:经理
该Role
模型只是一个普通模型,因此您可以像查询其他任何内容一样查询它:
Role.uniq.pluck :name
为了保持 api 端点 RESTful,我想理想地在 user_controller 的更新方法中传递角色参数。
通常,您最好使用单独的控制器来执行管理,并将其放在Admin::
名称空间中,并使用namespace :admin do
路由等。
然后在该控制器中,您可以使用普通access_control
块来确保没有其他人可以进入:
class Admin::UsersController < ApplicationController
access_control do
allow :admin
end
# ...
end
那么,是的,您可以通过多种方式设置/更新角色,但鉴于用户可以拥有许多角色,最好不要使用单个:role
参数,而是使用:
class User < ActiveRecord::Base
acts_as_authorization_subject
accepts_nested_attributes_for :roles
end
因此,在您的控制器中,您将拥有:
def user_params
params.require(:user).permit(:first_name, :last_name, roles_attributes: [:name])
end
然后在您的表单中,您可以执行以下操作:
= form_for :user do |f|
= f.text_field :first_name
= f.text_field :last_name
= f.fields_for :roles do |fr|
= fr.text_field :name
请注意,我假设您在这里只有简单的角色,而不是对象上的角色,如果您有对象角色,那么您将需要一些更棘手的东西来捕获authorizable_id
每个authorizable_type
角色,以及一些选择要在其上的对象的方法行为。
我怎样才能只为角色属性授权,以便用户对象的所有者仍然可以修改他们的名字、姓氏字段,但不能修改他们的角色字段?只允许管理员。
希望您现在已经自己回答了这个问题 - 通过对管理界面和用户自己的界面使用不同的控制器。
最后,使用 RoleTypes.ADMIN、RoleTypes.MANAGER 代替 :admin 是否可行且明智?
不,这些符号更简单更好,尽管这样做很常见:
class Role < ActiveRecord::Base
def self.permitted_roles
%i/admin manager foo bar wee/
end
end
这样你就可以Role.permitted_roles
用来构造一个复选框数组,或者一个下拉列表,或者类似的东西。