2010-12-27 7 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 { puts "Hello world!" }

+3

람다와 혼동하지 않고 블록입니다. – Phrogz

11

(1)#body에 전화 에서 {}를 제거합니다.


(1) 업데이트 : 해시 값 표현 방법 및 블록 : { } 두 가지 루비 의미를 갖기 때문에 이 오류가 발생한다. poetry 모드 (괄호 없음)로 프로 시저를 호출하면 파서가 메서드 이름 뒤에 {을 만난다면 모호한 점이 있습니다. 그것은 블록의 시작인가 아니면 해쉬 식인 매개 변수입니까? 귀하의 구체적인 경우에 불행한 가정은 그것이 블록이라는 것입니다.

이제 해시가 메소드의 마지막 인수 일 때 Ruby는 해시 표현을 중심으로 { }을 필요로하지 않습니다. 결과적으로이 문제를 해결하는 방법은 적어도 두 가지입니다. (1) {}을 제거하십시오. - Ruby는 해시 매개 변수를 전달하고 있음을 알게됩니다. 또는 (2) 메소드 parens를 추가하십시오. Rails가시 모드에서 일반적으로 사용되는 방법을 보면, C 또는 Java를 다시 추가하는 대신 영리한 Ruby 파서를 활용하여 문자를 제거하는 것이 이치에 맞는 것처럼 보입니다.

+0

또는 @NikitaRybak에서 제시하는대로 괄호를 추가하십시오. – Phrogz