2010-12-27 32 views
13

i karıştı ötesinde şeyler: Bu neredeyse bir kopyası/RoR eylem mailler kılavuzdan yapıştırmak olduğunu ve henüz bir sözdizimi hatası atar:gizemli yakut sözdizimi hatası

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 

hatadır:

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

herhangi bir fikir? Burada neyi yanlış yaptığımı anlayamıyorum.

cevap

28

Parantez body({...}) numaralı parantezleri hash argümanlı bir yöntem çağrısı yaptığınızı açıkça belirtmek için.

Aksi takdirde, {...} muhtemelen (resmi terim ne olursa olsun veya lambda) fonksiyonu ile karıştırılmaktadır body yönteminde geçirilen: body { puts "Hello world!" }

+3

Bir lambda ile değil, bir blokla karıştırılmış. – Phrogz

11

(1)#body çağrısına den { ve } çıkarın.


(1) güncelle: müzakere değeri ifade ve yöntem blokları: { } iki farklı Ruby anlamlara sahip olduğu için Bu hata gerçekleşir. Şiir modunda (parens yok) bir prosedür çağrılırsa, çözümleyici bir yöntem isminden sonra { ile karşılaşırsa bir belirsizlik söz konusudur. Bir bloğun başlangıcı mı yoksa Hash ifadesi olan bir parametre mi? Özel durumdaki talihsiz olan varsayım, bu bir bloktur.

Şimdi, olduğu gibi, Ruby bir yöntem için son argüman olduğunda Karma ifadeleri etrafında { } gerektirmez. Sonuç olarak, bu sorunu çözmenin en az iki yolu vardır: (1) {'u ve }'u kaldır - Ruby bir Hash parametresini geçirdiğinizi anlar; veya (2) yöntem parenslerini ekleyin. Rails'in genellikle şiir modunda nasıl kullanıldığını görmek, karakterleri kaldırmak ve akıllıca bir Ruby ayrıştırıcısından yararlanmak yerine bir la C veya Java eklemek yerine mantıklı görünmektedir.

+0

Veya, @NikitaRybak'ın önerdiği gibi, parantez ekleyin. – Phrogz