2012-02-25 29 views
16

Estoy viendo un RailsCast sobre asociaciones polimórficas. http://railscasts.com/episodes/154-polymorphic-association?view=asciicast

Hay tres modelos diferentes Artículo, Foto y Evento que cada uno toma un comentario de Comment.rb. (Artículo, Foto y Evento cada uno de un article_id, photo_id y event_id). En la enumeración de los comentarios que tiene el problema de averiguar cuál de los 3 modelos para listar los comentarios para, por lo que hace esto en la acción 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 

Mi pregunta es, ¿cuál es $1?

Respuesta

20

Según Avdi Grimm from RubyTapas

$ 1 es una variable global que se puede utilizar en código más tarde:

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

salida:

"La palabra coincidente fue el bar"

En resumen, $ 1, $ 2, $ ... son las variables globales utilizadas por algunas de las funciones de la biblioteca de ruby ​​especialmente relacionadas con REGEX para permitir que los programadores usen los hallazgos en códigos posteriores.

See this para tales variables más disponibles en Ruby.

+0

¿solo se crea cuando se usa el operador de tilde igual? –

+0

Sí, '$ 1',' $ 2' etc. coinciden con el primer, segundo, etc. grupos entre paréntesis en la última expresión regular; consulte el enlace en la respuesta. Rubocop recomienda usar 'Regexp.last_match (n)' en su lugar (note n está basado en cero, por lo tanto '$ 1' ==' #last_match (0) ' – MatzFan

12

El $1 es un grupo que coincide con la expresión regular anterior /(.+)_id$/. La variable $1 es la cadena que coincide entre paréntesis.