2010-12-27 18 views
13

私は混乱を超えてよ:これはほとんどRoRのアクションメーラーガイドのうちのコピー/ペーストである、そしてまだそれは構文エラーがスローされます。神秘的なルビーの構文エラー

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 

エラーは次のとおりです。

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

アイデア?私はここで何が間違っているのか分かりません。

答えて

28

明示的にハッシュ引数を使用してメソッド呼び出しを実行していることを括弧body({...})に追加します。

そうでない場合は、{...}は(公式用語だものは何でも、またはラムダ)は、おそらく機能と混同されbody方法で渡されている:body { puts "Hello world!" }

+3

ラムダと混同されるのではなく、むしろブロックです。 – Phrogz

11

(1)#bodyに呼び出しから{}を削除します。


(1)更新:ハッシュ値式と方法ブロック:{ }は、2つの異なるRubyで意味を持っているので 、このエラーが発生しました。プロシージャが詩モード(括弧なし)で呼び出された場合、メソッド名の後にパーサが{を見つけた場合、あいまいさがあります。それはブロックの始まりですか、それともハッシュ式のパラメータですか?あなたの特定のケースでは不幸なことですが、それはブロックであるということです。

ハッシュがメソッドの最後の引数である場合、Rubyはハッシュ式の回りに{ }を必要としません。その結果、この問題を解決するには少なくとも2つの方法があります。(1){}を削除する - Rubyは、あなたがHashパラメータを渡していることを理解しています。または(2)メソッドparensを追加します。 Railsが通常poetryモードでどのように使われているかを見てみると、CやJavaに戻すのではなく、文字を削除して巧妙なRubyパーサーを利用するのが理にかなっているようです。

+0

@NikitaRybakが示唆するように、かっこを追加します。 – Phrogz

関連する問題