2009-09-25 4 views
0

Я пытаюсь отправить электронное письмо нынешнему заемщику книги. Я создал ActionMailer с именем ReturnRequestMailer, который имеет метод please_return.Вызвать действие для отправки электронной почты в ruby ​​on 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 

Я пытаюсь вызвать этот метод из действия внутри моего BooksController

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

Что я призываю мой индекс книг со следующим link_to (игнорируя на некоторое время, что делает это в этом манера, вероятно, не является самым умным постоянным решением).

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

Все ссылки правильно, но я получаю NoMethodError в BooksController # request_return о том, что он не может найти метод please_return для ReturnRequestMailer. Что происходит, это предотвращает видимость метода please_return для BooksController?

ответ

1

добавить «доставить» перед вашим методом, чтобы он был таким:

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

Нельзя определить метод 'deliver_please_return', метод method_missing в ActionMailer будет знать, чтобы вызвать please_return.

0

При взгляде на ваш код метод please_return был вызван как метод класса, но вы определили его как метод экземпляра. (Более подробно об этом см To use self. or not.. in Rails)

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

должен это исправить.

Примечание: это не означает, что он отправил электронное письмо, но остановит ошибку NoMethodFound.

nasmorn states Чтобы позвонить, вам необходимо позвонить по телефону ReturnRequestMailer.deliver_please_return.

1

почтоотправителя в рельсах обычно используется следующим образом:

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 

Затем в контроллер из deliver_ перед именем метода и назвать его в качестве метода класса:

def request_return 
    @book = Book.find(params[:id]) 
    NewsletterMailer.deliver_please_return(@book.current_loan) 
end 
Смежные вопросы