现在我尝试查找用户是否有权以管理员身份执行操作。
这是用户型号代码:
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;假
为什么不是这样?
我认为管理员还有什么?方法需要一些重构。现在它是格外的,但我不知道如何重构):
答案 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? :admin
和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