2 votes

Comment accéder à l'espace de noms de niveau supérieur via la méta-programmation en Ruby?

Je peux accéder à l'espace de noms de premier niveau en Ruby avec deux deux-points devant le nom de la classe, par exemple ::AmbiguousClass

Comment pourrais-je faire cela via la méta-programmation ?

J'ai beaucoup de méthodes (plus de 5) qui valident et renvoient une classe donnée, dont toutes incluent une ligne comme ceci :

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

Je veux rendre cela plus général pour pouvoir simplement passer la classe à rechercher par UUID et réduire toutes ces méthodes en une seule. Voici ce que j'ai essayé :

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))
  # valider l'instance
end

Cela ne fonctionne pas - cela renvoie une erreur de syntaxe :

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

2voto

dax Points 4277

La suggestion de Michael Gorman d'interpolation de chaîne était bonne, voici ce qui a fini par fonctionner :

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

1voto

Michael Gorman Points 984

Vous pourriez utiliser l'interpolation de chaîne

"::\#\{model_name\}".capitalize.constantize

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X