当尝试调用 .deliver_later 以使用 Rails5.1 测试 ActionMailer 的功能时,我遇到了一个错误,它似乎无法找到该方法。我能够制作一个“测试应用程序”,我可以通过演练让它工作,但将它集成到我当前的项目中却不断出现问题。
当我比较它们时,这两个项目之间唯一的主要区别是脚手架用于有效的项目,而在我试图将其集成到其中的项目中却没有。以下是有问题的应用程序的内容。
痕迹
app/mailers/application_mailer.rb:1:in `<top (required)>'
app/mailers/mailer.rb:1:in `<top (required)>'
app/controllers/users_controller.rb:26:in `login'
This error occurred while loading the following files:
action_mailer/base
MyProject/app/controllers/users_controller.rb
class UsersController < ApplicationController
def login
@user = User.find_by('email = ?', params[:user][:email])
if @user && @user.authenticate(params[:user][:password])
##email tester
UserMailer.welcome_email(@user).deliver_later
session[:user_id] = @user.id
session[:user_email] = @user.email
redirect_to '/'
else
flash[:login] = ["Invalid Email or Password"]
redirect_back(fallback_location: users_signin_path)
end
end
end
MyProject/app/views/user_mailer/welcome_email.html.erb
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'
/>
</head>
<body>
<h1>Welcome to example.com, <%= @user.name %></h1>
<p>
You have successfully signed up to example.com,
your username is: <%= @user.login %>.<br>
</p>
<p>Thanks for joining and have a great day!</p>
</body>
</html>
MyProject/app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
MyProject/app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
default from: 'notifications@example.com'
def welcome_email(user)
@user = user
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Welcome to MyApp!')
end
end
宝石文件
gem 'rails', '~> 5.1.1'
gem 'pg', '~> 0.20'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'bcrypt', '~> 3.1.7'
gem 'geocoder'
gem 'geokit-rails'
gem 'carrierwave'
gem 'delayed_job_active_record'
gem 'filterrific'
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'capybara', '~> 2.13'
gem 'selenium-webdriver'
end
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem 'hirb'
gem 'rails-footnotes'
end
应用程序/配置/环境/development.rb
Rails.application.configure do
config.cache_classes = false
config.eager_load = false
config.consider_all_requests_local = true
if Rails.root.join('tmp/caching-dev.txt').exist?
config.action_controller.perform_caching = true
config.cache_store = :memory_store
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
config.action_mailer.raise_delivery_errors = false
config.action_mailer.perform_caching = false
config.action_mailer.perform_deliveries = true
config.action_mailer.deliver_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
port: 587,
domain: 'example.com',
user_name: 'myemail@gmail.com',
password: 'my_pw_for_gmail_acct',
authentication: 'plain',
enable_starttls_auto: true }
config.active_support.deprecation = :log
config.active_record.migration_error = :page_load
config.assets.debug = true
config.assets.quiet = true
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
end