0

当尝试调用 .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
4

0 回答 0