微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为这三种方法编写通用方法

如何解决为这三种方法编写通用方法

| 我有一个这样的模型用户
class User

  ROLES = {
            \"Admin\" => 1,\"Manager\" => 2,\"Officer\" => 3
          }

  def admin?
    role == 1
  end

  def manager?
    role == 2
  end

  def officer?
    role == 3
  end

end
其中“ 1”是“ 2”表中的一列,我想知道是否可以使用通用方法从“ 3”散列构建三种角色检查方法? 编辑 所以这似乎是答案
class User

  ROLES = {
            \"Admin\" => 1,\"Officer\" => 3
          }

  # methods used to identify whether a user is a specific role
  ROLES.each { |k,v| define_method(\"#{k.downcase}?\") { role == v } }

end
    

解决方法

        我不确定您的意图,但也许是这样吗?
class User
  %w[admin manager officer].each_with_index{|m,i| define_method(\"#{m}?\"){role == i+1}}
end
或者,使用
ROLES
class User
  ROLES.each{|m,i| define_method(\"#{m.downcase}?\"){role == i}}
end
    ,        我认为有两种选择。 首先,您可以添加method_missing实现,以检查该方法是否是您的角色名称之一。就像是:
def method_missing?(sym,*args)
  if args.empty? && ROLES.any? { |r| r.downcase + \"?\" == sym.to_s }
    # No additional arguments and the symbol for the method called 
    # matches a role name
    role == ROLES[sym.to_s.chomp(\'?\')] # Check the value
  else
    super
  end
end
另外,您可以从角色哈希中设置方法:
class User
  ROLES = { ... }
  ROLES.each_pair do |r,n|
    class_eval \"def #{r.downcase}?; role == #{n}; end\"
  end
end
    ,        大概有几种不同的方法可以实现,问题是,您希望它如何表现,以及在哪里希望使用方便/灵活? 如果我了解您要做什么,这样的事情可能会有所帮助
def to_methods(roles_hash)
  roles_hash.each_pair do |key,value|
    class_eval {
      \"def #{key}?
         role == #{value}
       end\" 
    }
  end
end
这将为您创建每个角色的方法。这就是您想要做的吗?     ,        我想你可以做这样的事情,但我认为你的方法读起来更好。
  (ROLES = {
    \"Admin\"   => 1,\"Manager\" => 2,\"Officer\" => 3,}).each { |k,v| define_method(k.downcase + \'?\') { role == v }}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。