geheimnisvolle ruby syntax-Fehler
ich bin über verwirrt: das ist fast ein copy/paste aus einem RoR-action-mailer-guide, und doch wirft es einen syntax-Fehler:
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
der Fehler ist:
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, } ^
irgendwelche Ideen? ich kann nicht herausfinden, was ich falsch mache hier.
InformationsquelleAutor der Frage kolosy | 2010-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klammern hinzufügen
body({...})
ausdrücklich darauf machst du einen Aufruf der Methode mit der hash-argument.Ansonsten
{...}
ist wahrscheinlich verwirrt mit der Funktion (oder des lambda, was der offizielle Begriff) weitergeleitet wird, in derbody
Methode:body { puts "Hello world!" }
InformationsquelleAutor der Antwort Nikita Rybak
Entfernen Sie die
{
und}
aus dem Aufruf(1) zu#body
.(1) Update:
Dieser Fehler tritt auf, weil
{ }
hat zwei verschiedene Bedeutungen in Ruby: Hash-Wert-Ausdrücke und-Methode blockiert. Wenn eine Prozedur aufgerufen wird, in der Poesie-Modus (ohne Klammern) dann gibt es eine Mehrdeutigkeit, wenn der parser auf ein{
nach dem Namen einer Methode. Ist es der Anfang eines Blocks, oder ist es ein parameter ist eine Hash-Ausdruck? Die Annahme, eine unglückliche ein, die in Ihrem spezifischen Fall haben, ist, dass es ein block.Nun, wie es geschieht, Ruby nicht erforderlich
{ }
um Hash-Ausdrücken, wenn der hash ist das Letzte argument, das auf eine Methode. So das Ergebnis ist, dass es mindestens zwei Möglichkeiten der Lösung dieses Problems: (1) entfernen Sie die{
und die}
-- Ruby versteht, dass Sie auf der Durchreise sind, einen Hash-parameter; oder (2) fügen Sie die Methode Klammern. Da, wie Schienen ist in der Regel in der Poesie-Modus, es scheint Sinn zu machen, entfernen Sie die Zeichen, und nutzen Sie die clevere Ruby-parser, anstatt fügen Sie Sie zurück a la C oder Java.InformationsquelleAutor der Antwort DigitalRoss