Rails ActionMailer实现中的语法错误

时间:2013-07-24 23:27:21

标签: ruby-on-rails actionmailer

我正在尝试通过简单的Ruby on Rails服务向自己发送通知电子邮件。我一直在关注使用http://guides.rubyonrails.org/action_mailer_basics.html上的ActionMailer指南和http://api.rubyonrails.org/classes/ActionMailer/Base.html上的文档我基本上复制/粘贴了指南中的代码,但是当我尝试使用时出现了一堆语法错误跑吧。

我已经四处寻找,但没有遇到任何有同样问题的人。鉴于我和Rails和Ruby缺乏经验,我怀疑我可能会遗漏一些基本的东西。

这是我的邮件:

class NotificationMailer < ActionMailer::Base
    default from: 'info@mydomain.com'

  def uploadNotification
    mail(to: "jim@mydomain.com", subject: "Upload Notification")
  end
end

我称之为:

NotificationMailer.uploadNotification.send

当应用尝试调用该方法时,我会收到以下错误:

SyntaxError (/Users/jimmcgowan/Sites/RoR/upload/app/models/notification_mailer.rb:2: syntax error, unexpected ':', expecting kEND
default from: 'info@mydomain.com'
             ^
/Users/jimmcgowan/Sites/RoR/upload/app/models/notification_mailer.rb:5: syntax error, unexpected ':', expecting ')'
mail(to: "jim@mmydomain.com", subject: "Upload Notification")
        ^
/Users/jimmcgowan/Sites/RoR/upload/app/models/notification_mailer.rb:5: syntax error, unexpected ',', expecting kEND
mail(to: "jim@mmydomain.com", subject: "Upload Notification")
                              ^
/Users/jimmcgowan/Sites/RoR/upload/app/models/notification_mailer.rb:5: syntax error, unexpected ')', expecting kEND):

为了尝试进行更简单的测试,我删除了'default from:'行,用一个简单的日志替换了uploadNotification方法中的mail()调用,并将调用代码更改为NotificationMailer.uploadNotification。但是,这导致了NoMethodError。

谁能给我一些关于我哪里出错的指示?

更新

似乎bgates的答案是正确的,这是由Ruby的语法差异版本1.8和1.9引起的。但是,升级托管虚拟服务器上的Ruby安装(运行旧版本的Suse)是不切实际的,所以我重新编写了类,以符合Ruby 1.8。为了存档,这是工作版本:

class NotificationMailer < ActionMailer::Base
  def uploadNotification
    from "My Server <info@mydomain.com>"
    recipients "jim@mydomain.com"
    subject "New Notification"
  end
end

我称之为:

NotificationMailer.deliver_uploadNotification

2 个答案:

答案 0 :(得分:0)

它抱怨的东西曾经是Ruby 1.8.x中的语法错误。如果您输入

$ ruby -v

在命令行中,如果数字小于1.9,则需要将Ruby更新为更新版本。

答案 1 :(得分:0)

我会做这样的事情:

class NotificationMailer < ActionMailer::Base
    default from: "Mydomain <info@mydomain.com>",
            return_path: "Mydomain <info@mydomain.com>"

    def upload_notification
      mail(:to => "jim@mydomain.com", 
           :subject => "Upload Notification")
    end
end

然后使用.deliver而不是.send

调用它
NotificationMailer.upload_notification.deliver