Ruby on rails 如何在Ruby中通过元编程访问顶级名称空间?
我可以在类名前面使用两个冒号访问Ruby中的顶级名称空间,例如Ruby on rails 如何在Ruby中通过元编程访问顶级名称空间?,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,我可以在类名前面使用两个冒号访问Ruby中的顶级名称空间,例如::AmbiguousClass 我怎样才能通过元编程做到这一点 我有很多方法(超过5个)可以验证和返回给定的类,所有这些方法都包括这样一行: player = ::Player.find_by(uuid: input.player_uuid) 我想让它更一般化,这样我就可以通过uuid传入要查找的类,并将所有这些方法缩减为一个。这就是我尝试过的: def validate_and_return(model_name) uuid
::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
类:
消息:您可以使用字符串插值
"::#{model_name}".captialize.constantize
Michael Gorman关于字符串插值的建议很好,这就是最终起作用的原因:
klass = "::#{model_name.to_s.capitalize}".constantize
什么是input
?input是一个绑定对象(),类似于openstructDoesklass=object.const_get(model_name.capitalize)
工作?试试klass=“:::{model_name.capitalialize}”。constantize
Michael,这并不完全正确,但它让我走上了正确的道路,谢谢!我将添加一个有效的答案。