2010-12-27 19 views
13

io sono al di là di confuso: questo è quasi un copia/incolla di una guida mailer azione RoR, ma getta un errore di sintassi:sintassi rubino misterioso errore

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 

l'errore è:

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, }^

qualche idea? non riesco a capire cosa sto facendo di sbagliato qui.

risposta

28

Aggiungere parentesi body({...}) per dichiarare esplicitamente che si sta facendo una chiamata di metodo con argomento hash.

In caso contrario, {...} è probabilmente confuso con la funzione (o lambda, tutto quello che è il termine ufficiale) essere passato nel metodo body: body { puts "Hello world!" }

+3

Non è confuso con un lambda, ma piuttosto un blocco. – Phrogz

11

Rimuovere il { e } dalla chiamata (1)-#body.


(1) Aggiornamento: Questo errore accade perché { } ha due significati diversi in Ruby: espressioni di valori hash e blocchi metodo. Se una procedura viene chiamata in modalità poesia (nessun paren), allora c'è un'ambiguità se il parser incontra uno { dopo il nome di un metodo. È l'inizio di un blocco o è un parametro che è un'espressione di hash? L'ipotesi, uno sfortunato nel tuo caso specifico, è che è un blocco.

Ora, come accade, Ruby non richiede { } intorno alle espressioni Hash quando l'hash è l'argomento finale di un metodo. Quindi il risultato è che ci sono almeno due modi per risolvere questo problema: (1) rimuovere lo { e lo } - Ruby capisce che stai passando un parametro di hash; o (2) aggiungere il metodo parens. Visto che Rails viene usato di solito in modalità poesia, sembra che abbia senso rimuovere i personaggi e sfruttare l'intelligente parser di Ruby piuttosto che aggiungerli alla C o Java.

+0

Oppure, come suggerisce @NikitaRybak, aggiungi parentesi. – Phrogz