找不到用户有admin的角色

时间:2013-04-18 09:58:01

标签: ruby ruby-on-rails-3

现在我尝试查找用户是否有权以管理员身份执行操作。

这是用户型号代码:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
  # attr_accessible :title, :body


  has_many :user_roles
  has_many :roles, :through => :user_roles


  def has_role?(role)
     case role
        when :admin then admin?
        when :member then true
        else false
     end
  end

  def admin?
    roles.each do |role|
       return true if role.name == 'admin'
    end

    return false
  end
end

现在有一个用户,其角色名称为admin,测试代码位于此处:

命令:rails c

user  = User.find(1)
user.has_role?('admin')

结果是:

=&GT;假

为什么不是这样?

我认为管理员还有什么?方法需要一些重构。现在它是格外的,但我不知道如何重构):

1 个答案:

答案 0 :(得分:2)

这是因为你在case语句中使用了方法参数和符号中的字符串。

重构has_role可能更好吗?方法是这样的:

def has_role?(role)
  case role.to_s
    when 'admin' then admin?
    when 'member' then true
    else false
  end
end

.to_s用于将非字符串(例如符号)转换为字符串,因此您可以使用相同的结果调用has_role? :adminhas_role? 'admin'

此外,您的admin?方法看起来非常难看。

您可以将其重写为:

def admin?
  roles.any? { |r| r.name == 'admin' }
end

或者将更多通用has_role?写为:

def has_role?(role)
  roles.any? { |r| r.name == role.to_s }
end