使用ActionMailer从发布数据发送电子邮件时出现问题

时间:2012-02-24 07:26:55

标签: ruby-on-rails ruby ruby-on-rails-3 actionmailer

我目前正在使用Rails 3并处理联系表单。我的数据正在发送,我可以从params哈希访问它,但当我尝试将它发送到我的ActionMailer类以便在电子邮件中使用时,我会被抛出奇怪的错误。

目前正在抛出此错误。

undefined method `TestName' for #<MessageMailer:0x00000003f43af0>

并说错误在这些行上

app/mailers/message_mailer.rb:8:in `message'
app/controllers/contact_controller.rb:20:in `message'

奇怪的是,'TestName'是我在:name输入的联系表单中输入的值。

这是来自message_mailer.rb和contact_controller.rb

的代码

MessageMailer

class MessageMailer < ActionMailer::Base

  include ActiveModel::Validations

  def message(data)

    @data = data
    validates_presence_of @data[:name]
    validates_presence_of @data[:email]
    validates_presence_of @data[:website]
    validates_presence_of @data[:message]

    mail(:from => "email@domain.com", :to => "email@domain.com", :subject => "New Message From #{data.name}")

  end
end

的ContactController

class ContactController < ApplicationController

  def message
    if request.post?
      @data = {
        :name => params[:name], 
        :email => params[:email], 
        :website => params[:website], 
        :message => params[:message]
      }

      if MessageMailer.message(@data).deliver
        redirect('/contact', :flash => 'Thank you for the message. I will get back to you as soon as possible')
      else
        redirect('/contact', :flash => 'Oops! Something went wrong. I will look into it. Until it\'s fixed you can email me at email@domain.com')
      end

    else
      redirect('/contact', :flash => 'Please fill out the contact form to get in touch.')
    end

  end

end

说错误在message_mailer.rb中的validates_presence_of @data[:name]行和contact_controller.rb中的if MessageMailer.message(@data).deliver

任何帮助都会很棒!

更新好的,我解决了原始错误,但现在它在wrong number of arguments (0 for 1)上抛出此错误MessageMailer.message(@data).deliver。我尝试将@data更改为params以绕过@data变量的任何问题,但它仍在提供。

2 个答案:

答案 0 :(得分:1)

validates_presence_of(以及其他验证方法)旨在成为采用属性名称进行测试的类方法。所以你使用它们的方式(在方法中是不正确的)导致它评估为

validates_presence_of TestName

这确实导致它检查

self.TestName 

这就是为什么你得到未定义的方法错误。

修复它的方法......

  1. 请勿在邮件中使用此类验证。只需使用String#empty?
  2. 手动检查这些字符串是否空白
  3. 创建一个分配了@data值的单独对象。使用validates_presence_of声明(在类级别,如ActiveRecord)并使用#validate进行测试!
  4. HTH

答案 1 :(得分:0)

请关注http://railscasts.com/episodes/206-action-mailer-in-rails-3http://guides.rubyonrails.org/action_mailer_basics.html

你可能在POST数据中犯了错误MessageMailer.message(@data)可能是类名&amp;功能名称问题。 或者可能是由于您需要在邮件配置设置后重新启动服务器。

让我知道它是否没有解决?