如何有条件地设置用户可以更新的角色?

时间:2012-06-21 19:07:24

标签: ruby-on-rails ruby-on-rails-3

我有一个用户可以在我的rails网站中拥有的5个角色

- @roles.each do |role|
  %label.radio
    = radio_button_tag 'user[role_ids][]', role.id, @user.has_role?(role.name)
    = role.name

我想要做的是基于我想要禁用它们或完全隐藏它们的current_user角色

我正在考虑以这种方式实现它,但它看起来不是很干净......任何想法

我想添加这个

:disabled => disable_role?(current_user, role.name)

def disable_role?(current_user, role_name)
  case  
  when role_name == 'superadmin' and current_user.superadmin?
    return false 
  when role_name == 'admin' and (current_user.superadmin? || current_user.admin?)
    return false 
  when role_name == 'standard' and (current_user.superadmin? || current_user.admin?)
    return false 
  else  
    return true  
  end
end

我有其他条件,但我想向您展示我的方法的一个例子 它看起来不那么俗气......任何其他建议

2 个答案:

答案 0 :(得分:1)

为了创建角色,我喜欢使用由Ryan Bates创建的gem CanCan。他展示了如何使用它在该截屏视频上进行身份验证:http://railscasts.com/episodes/192-authorization-with-cancan

但是,如果您要按照惯例进行操作,我过去只需在我的用户模型上添加一个新方法来验证这一点,以便每当它检查用户是否具有我想要的角色时

e.g

class User < ActiveRecord::Base
  def has_hole? role
    self.roles.where(name: role).size != 0
  end
end

答案 1 :(得分:1)

这就是我要做的事情:

class Role < ActiveRecord::Base
  ROLES_HIERARCHY = ['standard', 'admin', 'superadmin']

  def hierarchy(role_name)
    ROLES_HIERARCHY.index(role_name)
  end
  ...
end

- @roles.each do |role|
  %label.radio
    - if user.role.hierarchy > role.hierarchy
      = radio_button_tag 'user[role_ids][]', role.id, @user.has_role?(role.name) 
      = role.name