如何通过Ruby中的元编程访问顶级命名空间?

时间:2017-06-01 14:57:49

标签: ruby-on-rails ruby metaprogramming

我可以使用类名前面的两个冒号访问Ruby中的顶级命名空间,例如::AmbiguousClass

我怎么能通过元编程来做到这一点?

我有很多方法(超过5个)验证并返回给定的类,所有这些方法都包含这样一行:

player = ::Player.find_by(uuid: input.player_uuid)

我想让它更通用,所以我可以通过uuid传递给类找到并将所有这些方法切换成一个。这就是我尝试过的:

def validate_and_return(model_name)
  uuid_attr = "#{model_name}_uuid".to_sym
  return unless input.respond_to?(uuid_attr)
  klass = ::model_name.to_s.captialize.constantize
  instance = klass.find_by(uuid: input.send(uuid_attr))
  # validate instance
end

这不起作用 - 它返回语法错误:

Class: <SyntaxError>
Message: <"/home/dax/programming/xxx/lib/bus/converters/converter.rb:48: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT

2 个答案:

答案 0 :(得分:2)

迈克尔戈尔曼关于字符串插值的建议很好,这最终起作用了:

klass = "::#{model_name.to_s.capitalize}".constantize

答案 1 :(得分:1)

您可以使用String Interpolation

s(Group, bs = 're')