rails中使用郵件激活賬戶

  • 生成郵件程序模版
rails generate mailer UserMailer account_activation password_reset
  • 開發環境中的郵件配置
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :test
host = 'localhost:3000'
config.action_mailer.default_url_options = { host: host }
  • 生成application的郵件程序
    app/mailers/application_mailer.rb
    設置默認的發件人地址
class ApplicationMailer < ActionMailer::Base default
  from: "[email protected]"
  layout 'mailer'
end
  • 生成user的郵件程序
    app/mailers/user_mailer.rb
    發送賬戶激活鏈接
class UserMailer < ApplicationMailer


  def account_activation(user)
        @greeting = "Hi"
        @user = user

        mail to: user.email, subject: "Account activation"
    end


  def password_reset
    @greeting = "Hi"

    mail to: "[email protected]"
  end
  • 賬戶激活的純文本視圖
    app/views/user_mailer/account_activation.text.erb
Hi <%= @user.name %>,
Welcome to the Sample App! Click on the link below to activate your account:
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>
  • 賬戶激活的HTML視圖
    app/views/user_mailer/account_activation.html.erb
<h1>Sample App</h1>
<p>Hi <%= @user.name %>,</p>
<p>
Welcome to the Sample App! Click on the link below to activate your account:
</p>
<%= link_to"Activate",
edit_account_activation_url(@user.activation_token,
                                                     email: @user.email) %>
  • 生成的郵件預覽程序
    test/mailers/previews/user_mailer_preview.rb
class UserMailerPreview < ActionMailer::Preview

  def account_activation
    user = User.first
    user.activation_token = User.new_token
    UserMailer.account_activation(user)
  end

  def password_reset
    UserMailer.password_reset
  end

end
  • 電子郵件測試
    test/mailers/user_mailer_test.rb
require 'test_helper'

class UserMailerTest < ActionMailer::TestCase
  test "account_activation" do
    user = users(:michael)
    user.activation_token = User.new_token
    mail = UserMailer.account_activation(user)
    assert_equal "Account activation", mail.subject
    assert_equal [user.email], mail.to
    assert_equal ["[email protected]"], mail.from
    assert_match user.name, mail.body.encoded
    assert_match user.activation_token, mail.body.encoded
    assert_match CGI.escape(user.email), mail.body.encoded
  end
end

執行rails test,發現測試無法通過,錯誤如下:

ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

錯誤原因:config/environments/test.rb中缺少host配置,添加config.action_mailer.default_url_options = { host: 'localhost:3000' }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章