2017-06-01 3 views
2

kann ich den Top-Level-Namespace in Ruby mit zwei Doppelpunkten vor dem Klassennamen zuzugreifen, zum Beispiel ::AmbiguousClassWie kann ich über Metaprogrammierung in Ruby auf den Namespace der obersten Ebene zugreifen?

Wie ich, dass über metaprogramming tun könnte?

ich viele Methoden (mehr als 5), die eine bestimmte Klasse zu validieren und zurück, von denen alle eine Zeile wie diese sind:

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

Ich möchte, dass machen allgemeinere so kann ich nur Gehe in der Klasse vorbei, um nach Uuid zu suchen, und reduziere alle diese Methoden zu einem. Dies ist, was ich versucht habe:

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 

das funktioniert nicht - es gibt einen Syntaxfehler:

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

Was ist 'Eingabe'? –

+0

Eingabe ist ein gebundenes Objekt (https://github.com/neopoly/bound/), ähnliches Verhalten zu openstruct – dax

+1

Funktioniert 'klass = Object.const_get (model_name.capitalize)'? – Stefan

Antwort

2

Michael Gorman Vorschlag von String Interpolation war gut, das ist, was am Ende funktionierte:

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

Sie könnten String Interpolation verwenden

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

Michael, das war nicht genau richtig, aber es hat mich auf die richtige Spur gebracht, danke! Ich füge eine Antwort hinzu mit dem was funktioniert. – dax

Verwandte Themen