2009-09-25 8 views
0

Je tente d'envoyer un courriel à l'emprunteur actuel d'un livre. J'ai créé un ActionMailer appelé ReturnRequestMailer qui a une méthode appelée please_return.Invoquer une action pour envoyer un courriel en ruby ​​sur rails

class ReturnRequestMailer < ActionMailer::Base 
    def please_return(book_loan) 
    subject 'Book Return Request' 
    recipients book_loan.person.email 
    from  '[email protected]' 
    sent_on Time.now 

    body  :book_loan => book_loan 
    end 
end 

Je tente d'appeler cette méthode à partir d'une action à l'intérieur de mon BooksController

def request_return 
    @book = Book.find(params[:id]) 
    ReturnRequestMailer.please_return(@book.current_loan) 
end 

qui j'invoque mon index de livres avec le link_to suivant (en ignorant pour le moment que le faire dans ce manière n'est probablement pas la solution permanente la plus intelligente).

<%= link_to 'Request Return', {:action => 'request_return' , :id => book} %> 

Tout lien correctement, mais je reçois un NoMethodError dans BooksController # request_return indiquant qu'il ne peut pas trouver la méthode please_return pour ReturnRequestMailer. Que se passe-t-il qui empêche la méthode please_return d'être visible pour le BooksController?

Répondre

1

ajouter une 'deliver_' devant votre méthode, donc ce sera:

Vous n'avez pas besoin de définir Méthode 'deliver_please_return', La méthode method_missing dans ActionMailer saura appeler call_return.

0

En regardant votre code, il semble que la méthode please_return a été appelée en tant que méthode de classe, mais vous l'avez définie en tant que méthode d'instance. (Pour plus de détails sur ce sujet, voir To use self. or not.. in Rails)

class ReturnRequestMailer < ActionMailer::Base 
    def self.please_return(book_loan) 
    ... 

devrait fixer.

Notez que cela n'entraînera pas l'envoi de l'e-mail, mais arrêtera l'erreur NoMethodFound. En tant que nasmorn states, vous devez appeler le ReturnRequestMailer.deliver_please_return pour que le courrier soit livré.

1

Le Mailer dans des rails est habituellement utilisé comme ceci:

class ReturnRequestMailer < ActionMailer::Base 
    def please_return(book_loan) 
    subject 'Book Return Request' 
    recipients book_loan.person.email 
    from  '[email protected]' 
    sent_on Time.now 

    body  :book_loan => book_loan 
    end 
end 

Ensuite, dans le contrôleur sur deliver_ devant le nom de la méthode et de l'appeler comme une méthode de classe:

def request_return 
    @book = Book.find(params[:id]) 
    NewsletterMailer.deliver_please_return(@book.current_loan) 
end 
Questions connexes