0

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

这是用户模型代码:

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')

结果是:

=> 假的

为什么不是真的?

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

4

1 回答 1

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? :adminand 并has_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
于 2013-04-18T10:24:37.750 回答