Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Ruby中通过元编程访问顶级名称空间?_Ruby On Rails_Ruby_Metaprogramming - Fatal编程技术网

Ruby on rails 如何在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

我可以在类名前面使用两个冒号访问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
类:

消息:您可以使用字符串插值

"::#{model_name}".captialize.constantize

Michael Gorman关于字符串插值的建议很好,这就是最终起作用的原因:

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

什么是
input
?input是一个绑定对象(),类似于openstructDoes
klass=object.const_get(model_name.capitalize)
工作?试试
klass=“:::{model_name.capitalialize}”。constantize
Michael,这并不完全正确,但它让我走上了正确的道路,谢谢!我将添加一个有效的答案。