2010-12-27 24 views
13

Estoy más confundido: esto es casi una copia/pega de una guía de acción RoR gestor de correo, y sin embargo, arroja un error de sintaxis:sintaxis rubí misteriosa error

class Contact < ActionMailer::Base 


    def contact a_name, a_company, a_phone, a_email, a_comments 
    subject "Contact request from #{name}" 
    recipients "[email protected]" 
    from  "[email protected]" 
    sent_on Time.now 
    body  { :name => a_name, :company => a_company, :phone => a_phone, :email => a_email, :comments => a_comments } 
    end 

end 

el error es:

app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting '}' body { :name => a_name, :company => a_company...^app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...{ :name => a_name, :company => a_company, :phone => a_phone,...^app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...ompany => a_company, :phone => a_phone, :email => a_email, :...^app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ..., :phone => a_phone, :email => a_email, :comments => a_comme...^app/models/contact.rb:9: syntax error, unexpected tASSOC, expecting tCOLON2 or '[' or '.' ...email => a_email, :comments => a_comments, }^

¿Alguna idea? No puedo entender lo que estoy haciendo mal aquí.

Respuesta

28

Agregue paréntesis body({...}) para indicar explícitamente que está haciendo una llamada a método con argumento hash.

De lo contrario, {...} es probablemente confundirse con la función (o lambda, lo que sea que el término oficial) que se pasa en el método body: body { puts "Hello world!" }

+3

No se confunde con una lambda, sino más bien como un bloque. – Phrogz

11

Retire la { y } de la llamada (1)-#body.


(1) Actualización: Este error ocurre porque { } tiene dos significados diferentes en Ruby: expresiones de valor hash y bloques de método. Si se llama a un procedimiento en modo poesía (sin parens), existe una ambigüedad si el analizador encuentra un { después de un nombre de método. ¿Es el comienzo de un bloque o es un parámetro que es una expresión Hash? La suposición, desafortunada en su caso específico, es que es un bloqueo.

Ahora, sucede que Ruby no requiere { } alrededor de las expresiones hash cuando el hash es el argumento final de un método. El resultado es que hay al menos dos formas de resolver este problema: (1) eliminar { y } - Ruby entiende que está pasando un parámetro Hash; o (2) agregue el método parens. Viendo cómo Rails se usa generalmente en modo poesía, parece tener sentido eliminar personajes y aprovechar el inteligente analizador de Ruby en lugar de volverlos a agregar a la C o Java.

+0

O, como @NikitaRybak sugiere, agregue paréntesis. – Phrogz