Actionmailer не распознал приложение rails 3

Я пытаюсь отправить почту с помощью actionmailer в приложении Rails 3.0.1. Вот моя установка

config/initializers/setup_mail.rb

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :domain               => "saidyes.co.uk",
  :user_name            => "username",
  :password             => "password",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

ActionMailer::Base.default_url_options[:host] = "localhost:3000"
ActionMailer::Base.register_interceptor(DevelopmentMailInterceptor) if  Rails.env.development?

конфиг/окружения/развитие.rb

config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true

приложение/почтовые программы/user_mailer.rb

class UserMailer < ActionMailer::Base
  default :from => "[email protected]"

  def self.registration_confirmation(user)
    @user = user
    attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
    mail(:to => "#{user.email}", :subject => "Welcome")
  end
end

приложение/модели/user.rb

require "#{Rails.root}/app/mailers/user_mailer" 

after_create :send_welcome_email

private 
def send_welcome_email
  UserMailer.registration_confirmation(self).deliver
end

Первой ошибкой, которую я получил, была неинициализированная константа UserMailer в моем классе модели Users. Я исправил это, добавив требование вверху определения модели пользователя. Теперь я получаю

неопределенная локальная переменная или метод `attachments' для UserMailer:Class

Должно быть, я неправильно настроил actionmailer, или мое приложение rails неправильно настроено для использования mailer.

В любом случае любой совет или помощь будут оценены.

Ваше здоровье


person Dermot    schedule 02.10.2011    source источник


Ответы (1)


Я думаю, что простая проблема, с которой вы столкнулись, заключается в том, что почтовые методы должны быть определены для экземпляров вашего класса почтовой программы.

А именно должно быть

class UserMailer < ActionMailer::Base
  def registration_confirmation(user)
    @user = user
    attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
    mail(:to => "#{user.email}", :subject => "Welcome")
  end
end

Обратите внимание, что нет self

Ознакомьтесь с полезным Руководством по Rails по этому вопросу.

Как и в вашем примере, вы все равно будете вызывать метод в классе

UserMailer.registration_confirmation(user).deliver

Метод класса творит чудеса, создавая экземпляр экземпляра и обеспечивая отображение правильного шаблона.

person Matthew Rudy    schedule 03.10.2011
comment
дох! Я вставил ссылку на себя, когда получил более раннюю ошибку неинициализированного постоянного почтовика пользователя в пользовательской модели. В любом случае спасибо, что нашли время ответить, это сработало! - person Dermot; 04.10.2011