Неверное количество аргументов ошибка с TestMailer
У меня странная проблема с отправкой писем. Я получаю это исключение:
ArgumentError (wrong number of arguments (1 for 0)):
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/base.rb:642:in `initialize'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/base.rb:642:in `new'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/base.rb:642:in `create'
/usr/lib/ruby/gems/1.8/gems/ar_mailer-1.3.1/lib/action_mailer/ar_mailer.rb:92:in `perform_delivery_activerecord'
/usr/lib/ruby/gems/1.8/gems/ar_mailer-1.3.1/lib/action_mailer/ar_mailer.rb:91:in `each'
/usr/lib/ruby/gems/1.8/gems/ar_mailer-1.3.1/lib/action_mailer/ar_mailer.rb:91:in `perform_delivery_activerecord'
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib/action_mailer/base.rb:508:in `__send__'
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib/action_mailer/base.rb:508:in `deliver!'
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib/action_mailer/base.rb:383:in `method_missing'
/app/controllers/web_reservations_controller.rb:29:in `test_email'
В моем web_reservations_controller у меня есть просто вызов метода
TestMailer.deliver_send_email
А мой TesMailer - это что-то вроде:
class TestMailer < ActionMailer::ARMailer
def send_email
@recipients = "xxx@example.com"
@from = "xxx@example.com"
@subject = "TEST MAIL SUBJECT"
@body = "<br>TEST MAIL MESSAGE"
@content_type = "text/html"
end
end
Есть ли у вас какие-либо идеи?
Спасибо! Роберто
2 ответа
Проблема в модели, используемой ar_mailer для хранения сообщения. Вы можете увидеть в обратном следе, что исключение исходит от ActiveRecord::Base.create, когда он вызывает initialize. Обычно конструктор ActiveRecord принимает аргумент, но в этом случае похоже, что ваша модель этого не делает. ar_mailer должен использовать модель под названием Email. У вас есть этот класс в вашем каталоге app/models? Если так, что-нибудь переопределяется с инициализацией? Если вы переопределяете инициализацию, обязательно дайте ей аргументы и вызовите super.
class Email < ActiveRecord::Base
def initialize(attributes)
super
# whatever you want to do
end
end
Убедитесь, что email_class установлен правильно: http://seattlerb.rubyforge.org/ar_mailer/classes/ActionMailer/ARMailer.html
Также не используйте переменные экземпляра. Пытаться:
class TestMailer < ActionMailer::ARMailer
def send_email
recipients "roberto.druetto@gmail.com"
from "roberto.druetto@gmail.com"
subject "TEST MAIL SUBJECT"
content_type "text/html"
end
end
Из документации: у метода body особое поведение. Он принимает хеш, который генерирует переменную экземпляра, названную в честь каждого ключа в хэше, содержащего значение, на которое указывает этот ключ.
Так что-то вроде этого добавлено к методу выше:
body :user => User.find(1)
Позволит вам использовать @user
в шаблоне.