2012-02-25 18 views
16

Sto guardando un RailsCast su associazioni polimorfiche. http://railscasts.com/episodes/154-polymorphic-association?view=asciicast

Ci sono tre diversi modelli Articolo, Foto ed Evento che ognuno di essi prende un commento da Comment.rb. (Articolo, Foto ed Evento ciascuno di un article_id, photo_id e event_id). Nell'elencare i commenti che ha il problema di capire quale dei 3 modelli alla lista dei commenti per, quindi lo fa nell'azione index

def index 
    @commentable = find_commentable 
    @comments = @commentable.comments 
end 


def find_commentable 
    params.each do |name, value| 
    if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
    end 
    end 
    nil 
end 

La mia domanda è, che cosa è $1?

risposta

20

Secondo Avdi Grimm from RubyTapas

$ 1 è una variabile globale che può essere utilizzato nel codice in seguito:

if "foobar" =~ /foo(.*)/ then 
    puts "The matching word was #{$1}" 
end 

uscita:

"La parola corrispondente era bar"

In breve, $ 1, $ 2, $ ... sono le variabili globali utilizzate da alcune delle funzioni della libreria ruby, specialmente per quanto riguarda lo REGEX per consentire ai programmatori di utilizzare i risultati nei codici successivi.

See this per ulteriori variabili disponibili in Ruby.

+0

il suo unico creato quando si utilizza l'operatore tilde uguale ?? –

+0

Sì, '$ 1',' $ 2' ecc. Corrispondono al primo, al secondo, ecc. Gruppi con parentesi nell'ultima espressione regolare - vedere il collegamento nella risposta. Rubocop raccomanda invece di utilizzare 'Regexp.last_match (n)' (la nota n è basata su zero, quindi '$ 1' ==' #last_match (0) ' – MatzFan

12

Il $1 corrisponde al gruppo corrispondente all'espressione regolare sopra /(.+)_id$/. La variabile $1 corrisponde alla stringa corrispondente tra parentesi.