我感到困惑:这几乎是RoR动作邮件程序指南的复制/粘贴,但它会引发语法错误:
class Contact < ActionMailer::Base
def contact a_name, a_company, a_phone, a_email, a_comments
subject "Contact request from #{name}"
recipients "some@address.com"
from "some_other@address.com"
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, } ^
任何想法?我无法弄清楚我在这里做错了什么。
答案 0 :(得分:28)
添加括号body({...})
以明确说明您正在使用散列参数进行方法调用。
否则,{...}
可能与body
方法中传递的函数(或lambda,无论是官方术语)混淆:body { puts "Hello world!" }
答案 1 :(得分:11)
从调用(1)移除{
和}
到#body
。
(1)更新:
发生此错误是因为{ }
在Ruby中有两个不同的含义:哈希值表达式和方法块。如果在诗歌模式中调用过程(没有parens),那么如果解析器在方法名称后遇到{
,则存在歧义。它是一个块的开头还是一个Hash表达式的参数?在你的具体案例中,一个不幸的假设是,这是一个障碍。
现在,当哈希是方法的最后一个参数时,Ruby不需要围绕Hash表达式{ }
。所以结果是至少有两种方法可以解决这个问题:(1)删除{
和}
- Ruby知道你传递了一个Hash参数;或(2)添加方法parens。看看如何在诗歌模式中使用Rails,删除字符并利用聪明的Ruby解析器而不是将它们添加回la C或Java似乎是有意义的。
功能