Проблемы с отправкой электронной почты из почтовых данных с помощью ActionMailer - PullRequest
0 голосов
/ 24 февраля 2012

В настоящее время я использую 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

Это говорит о том, что ошибки находятся на линии validates_presence_of @data[:name] в message_mailer.rb и if MessageMailer.message(@data).deliver в contact_controller.rb

Любая помощь будет отличной!

ОБНОВЛЕНИЕ: Хорошо, я решил исходную ошибку, но теперь она выдает эту ошибку wrong number of arguments (0 for 1) на MessageMailer.message(@data).deliver. Я попытался изменить @data на params, чтобы обойти любые проблемы с переменной @data, и она все еще дает это.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

validates_presence_of (и другие методы проверки) предназначены для того, чтобы быть методами класса, которые принимают имя свойства для проверки.Таким образом, способ их использования (что неверно внутри метода) заставляет его оценивать

validates_presence_of TestName

, что действительно приводит к проверке на

self.TestName 

, поэтому вы получаетенеопределенная ошибка метода.

Способы исправить это ...

  1. Не используйте подобные проверки в почтовой программе.Просто вручную проверьте пустоту этих строк, используя String # empty?
  2. Создайте отдельный объект, которому присваиваются значения @data.Используйте объявления validates_presence_of ( на уровне класса , как ActiveRecord) и тестируйте, используя #validate!

HTH

0 голосов
/ 24 февраля 2012

Пожалуйста, следуйте http://railscasts.com/episodes/206-action-mailer-in-rails-3 и http://guides.rubyonrails.org/action_mailer_basics.html.

Возможно, вы допустили ошибку в данных POST MessageMailer.message(@data) возможно, проблема с именем класса и именем функции.Или может быть из-за необходимости перезагрузить сервер после настройки почтовой конфигурации.

, дайте мне знать, если это не решено?

...