2011-11-16 2 views
4

J'ai une chaîne que je veux utiliser dans le cadre d'un nom de variable. Plus précisément, dans les chemins de routage Rails:Comment utiliser une chaîne dans le nom de variable Ruby?

<%= foo_path %> 
<%= bar_path %> 

Je souhaite que la première partie du nom de la route soit dynamique. Donc quelque chose comme

@lol = "foo" 
<%= [@lol]_path %> # <-- This would really be the "foo_path" variable 

Est-ce que Ruby peut le faire?

Répondre

9

Bien sûr:

lol = 'foo' 

send "#{lol}_path" 
# or 
send lol + '_path' 

Explication: Object#send envoie la méthode (à savoir "appelle" la méthode sur) le récepteur. Comme avec n'importe quel appel de méthode, sans récepteur explicite (par exemple, some_object.send 'foo'), le contexte actuel devient le récepteur, l'appel send :foo est équivalent à self.send :foo. En fait Rails utilise beaucoup cette technique dans les coulisses (e.g.).

+3

épique !! à des fins de pédagogie, comment quelqu'un pourrait-il apprendre quelque chose comme ça? Juste d'une plus longue exposition à Ruby? – Tim

+2

L'exposition vous aidera certainement, mais si vous allez utiliser Ruby, vous pourriez faire bien pire que de lire les docs pour autant de classes de base que possible, en particulier [Object] (http: // www. ruby-doc.org/core-1.9.3/Object.html) et [Kernel] (http://www.ruby-doc.org/core-1.9.3/Kernel.html) (mais vraiment [aucun d'eux ] (http://www.ruby-doc.org/core-1.9.3/) est très long). Et n'oubliez pas [le Pioche] (http://www.rubycentral.com/pickaxe/), le livre de Ruby (et gratuit). –

+0

J'ai lu ces sources, et je ne les ai pas. Ça aide tellement plus quand quelqu'un m'explique, enseigne ou me montre. Ou au moins m'amène au point de pouvoir comprendre. Il y a des plafonds en verre techniques au départ qui deviennent invisibles pour les programmeurs chevronnés. – ahnbizcad

2

Quelque chose de plus!

class Person 
    attr_accessor :pet 
end 

class Pet 
    def make_noise 
    "Woof! Woof!" 
    end 
end 

var_name = "pet" 
p = Person.new 
p.pet = Pet.new 
(p.send "#{var_name}").make_noise 

Alors qu'est-ce qui se passe ici est:
p.send "some_method" appels p.some_method et les parenthèses entourant rend l'enchaînement possible à savoir appeler p.pet.make_noise à la fin. J'espère que je suis clair.

+0

Je pense qu'il serait plus idiomatique d'écrire 'p.send (var_name) .make_noise'. –

Questions connexes