Errore del numero errato di argomenti con TestMailer
-
02-07-2019 - |
Domanda
Sto riscontrando uno strano problema durante l'invio di e-mail. Ricevo questa eccezione:
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'
Nel mio web_reservations_controller ho semplicemente un metodo che chiama
TestMailer.deliver_send_email
E il mio TesMailer è qualcosa del tipo:
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
Hai qualche idea?
Grazie! Roberto
Soluzione
Il problema riguarda il modello utilizzato da ar_mailer per archiviare il messaggio. Puoi vedere nel backtrace che l'eccezione proviene da ActiveRecord :: Base.create quando chiama inizializza. Normalmente un costruttore ActiveRecord accetta un argomento, ma in questo caso sembra che il tuo modello non lo faccia. ar_mailer dovrebbe usare un modello chiamato Email. Hai questa classe nella tua directory app / modelli? In tal caso, viene sovrascritto qualcosa con inizializzazione? Se stai eseguendo l'override di inizializzazione, assicurati di fornire argomenti e chiama super.
class Email < ActiveRecord::Base
def initialize(attributes)
super
# whatever you want to do
end
end
Altri suggerimenti
Verifica che email_class sia impostato correttamente: http: // seattlerb. rubyforge.org/ar_mailer/classes/ActionMailer/ARMailer.html#M000002
Inoltre, non utilizzare le variabili di istanza. Prova:
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
Dai documenti: il metodo body ha un comportamento speciale. Prende un hash che genera una variabile di istanza che prende il nome da ogni chiave nell'hash contenente il valore a cui punta quella chiave.
Quindi qualcosa di simile è stato aggiunto al metodo sopra:
body :user => User.find(1)
Ti consentirà di utilizzare @user
nel modello.