我正在尝试通过rails来测试后续电子邮件的功能,我想在用户通过电子邮件将书签地址发送到mailgun(我已经测试并且正在运行)之后发送。我不确定我的邮件代码是否设置正确,但是当我向mailgun发送电子邮件时没有发送后续电子邮件。
这是我的自定义邮件:
<!DOCTYPE html>
<html>
<head>
<meta content= 'text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Hi <%= @user.name %>,</h1>
<p>
This is just a friendly email to let you know the following bookmark was saved:
</p>
<p>
<%= @bookmark.url %>
</p>
<p>
Cheers! <br/>
Bookmarks.com
</p>
</body>
</html>
这是我传入的控制器代码:
class IncomingController < ApplicationController
skip_before_filter :verify_authenticity_token
def create
Rails.logger.info "INCOMING PARAMS HERE: #{params}"
Rails.logger.info "Topics: #{params[:subject]}"
Rails.logger.info "Url: #{params['stripped-text']}"
Rails.logger.info "User email: #{params[:sender]}"
user = User.find_by_email(params[:sender])
Rails.logger.info "@@@@@@@@@@@@@@@@ User: #{user.inspect}"
if user
@bookmark = Bookmark.new(url: params['stripped-text'])
topics = []
topic_names = params[:subject].split(' ')
topic_names.each do |topic_name|
name = topic_name.sub(/#/, '')
topics << Topic.find_or_create_by_name(name)
end
if @bookmark.save
topics.each do |topic|
@bookmark.topics << topic
end
user.bookmarks << @bookmark
FollowUpMailer.notify(@bookmark).deliver
end
end
head 200
end
end
这是我的创建网址书签代码:
def create
@bookmark = Bookmark.new(bookmark_params)
@bookmark.user = current_user
if @bookmark.save
topic_names = params[:topic_names]
topic_names = topic_names.split(' ')
topic_names.each do |topic_name|
name = topic_name.sub(/#/, '')
topics << Topic.find_or_create_by_name(name)
end
respond_to do |format|
format.html { redirect_to @bookmark, notice: 'Bookmark was successfully created.' }
format.json { render action: 'show', status: :created, location: @bookmark }
end
else
respond_to do |format|
format.html { render action: 'new' }
format.json { render json: @bookmark.errors, status: :unprocessable_entity }
end
end
end
我测试这个的唯一方法是通过生产邮件发送邮件并查看我的本地rails服务器日志(没有显示任何行动的迹象),所以我无法弄清楚怎么回事在开发中本地测试邮件程序,因为我还是编程新手。我可以获得一些关于如何测试以获得一些错误的想法吗?谢谢!
问题编辑: 我忘了添加我的follow_up_mailer.rb代码:
class FollowUpMailer < ActionMailer::Base
default from: "valeriemettler@gmail.com"
def notify(bookmark)
@bookmark = bookmark
mail(to: user.email, subject: 'Your bookmark was saved!')
end
end
这是我使用FollowUpMailer.notify(Bookmark.first)测试后得到的错误.deliver:
2.0.0-p481 :001 > FollowUpMailer.notify(Bookmark.first)deliver
SyntaxError: (irb):1: syntax error, unexpected tIDENTIFIER, expecting end-of-input
from /home/vagrant/.rvm/rubies/ruby-2.0.0-p481/bin/irb:12:in `<main>'
有什么想法吗?
答案 0 :(得分:1)
快速说明,在答案的其余部分之前。当您在Production上发送/接收消息时,您的本地服务器应该不显示任何内容。您应该查看生产服务器日志(
heroku logs
)以查看工作/错误。但是,我不认为这是测试这个的最好方法,所以我的完整答案如下......
邮件程序在Rails中需要多个部分。你已经掌握了大部分内容,但你似乎错过了邮件程序类 - 即FollowUpMailer
。
该文件应该在app/mailers/follow_up_mailer.rb
中,它应该定义一个notify
方法,这是在控制器中运行该行代码时调用的方法。
查看主题上的Rails Guide,了解该方法应该是什么样的,如何将变量传递给视图,以及应该命名的视图以及它所在的位置。
更一般地说,我建议尝试将一些逻辑移到Bookmark模型中。这可能看起来不太重要,但它会让你的生活更轻松。如果您将邮件行为与控制器分离,则可以更轻松地直接测试邮件。
也许在Bookmark类上创建一个save_and_notify
方法,如果它没有返回true,则在控制器中抛出一个错误。该方法将包含您行动的最后几行:
topics.each do |topic|
@bookmark.topics << topic
end
user.bookmarks << @bookmark
FollowUpMailer.notify(@bookmark).deliver
它还必须以topics
和user
作为参数。
有很多方法可以将一些逻辑移入模型中。那只是一个。完成后,您可以更轻松地从Rails控制台测试书签保存和消息发送,或者为它编写测试。
请注意,您现在也可以直接在控制台中测试邮件。只需这样做:
FollowUpMailer.notify(Bookmark.first).deliver
。发送时遇到的任何错误都应该在控制台中引发。请确保设置消息拦截器,否则,每当您测试时,您都会发送实时消息。
要修复邮件程序中的一个错误,您需要在@user
方法中定义notify
变量。该变量在邮件程序视图中使用,但未在其关联方法中定义(基本上是邮件程序的控制器操作)。或者,您可以从视图@bookmark.user.name
中的书签推断用户。无论哪种方式,请尝试在本地控制台中对此进行测试,并立即获得有关其是否正常工作的反馈。