Rails 密码重置邮件程序测试未定义方法 `html_safe' 错误(使用 Clearance gem)
Rails password reset mailer test undefined method `html_safe' error (using Clearance gem)
我正在尝试在 Rails 中创建一个邮件程序测试以检查 Clearance sends.
的密码重置邮件程序
密码重置邮件程序的默认视图中有此 link:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token.html_safe) %>
似乎调用 html_safe
是件好事,但在我的邮件测试中,我不断收到此错误:
Minitest::UnexpectedError: ActionView::Template::Error: undefined method `html_safe' for nil:NilClass
Did you mean? html_safe?
我不明白为什么会这样。到目前为止,这是我的邮件测试:
require "test_helper"
class PasswordResetMailerTest < ActionMailer::TestCase
setup do
@user = users(:elvis)
end
test "password reset email" do
email = ClearanceMailer.change_password(@user)
# Send the email, then test that it got queued
assert_emails 1 do
email.deliver_now
end
end
end
为什么会导致 undefined method html_safe
错误?
您可以通过以下方式解决此问题:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token&.html_safe) %>
使用 &.
运算符,因此如果它为 nil,则不会抛出异常。异常的原因可能是直接调用邮件程序,所以在你的测试中你调用了 ClearanceMailer.change_password(@user)
并且当用户点击忘记密码或其他东西时发送这封电子邮件(意味着在发送电子邮件之前发生了一个过程)它在用户身上设置确认令牌,当发送电子邮件时 @user.confirmation_token
存在。因此,要解决此问题,您可以:
- 使用上面指定的
&.
- 调用之前调用的方法设置确认令牌
- 或者您可以手动设置一个随机确认令牌
user.update(confirmation_token: 'random text')
因为这只是一个测试,您正在检查电子邮件是否应该送达。
我正在尝试在 Rails 中创建一个邮件程序测试以检查 Clearance sends.
的密码重置邮件程序密码重置邮件程序的默认视图中有此 link:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token.html_safe) %>
似乎调用 html_safe
是件好事,但在我的邮件测试中,我不断收到此错误:
Minitest::UnexpectedError: ActionView::Template::Error: undefined method `html_safe' for nil:NilClass
Did you mean? html_safe?
我不明白为什么会这样。到目前为止,这是我的邮件测试:
require "test_helper"
class PasswordResetMailerTest < ActionMailer::TestCase
setup do
@user = users(:elvis)
end
test "password reset email" do
email = ClearanceMailer.change_password(@user)
# Send the email, then test that it got queued
assert_emails 1 do
email.deliver_now
end
end
end
为什么会导致 undefined method html_safe
错误?
您可以通过以下方式解决此问题:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token&.html_safe) %>
使用 &.
运算符,因此如果它为 nil,则不会抛出异常。异常的原因可能是直接调用邮件程序,所以在你的测试中你调用了 ClearanceMailer.change_password(@user)
并且当用户点击忘记密码或其他东西时发送这封电子邮件(意味着在发送电子邮件之前发生了一个过程)它在用户身上设置确认令牌,当发送电子邮件时 @user.confirmation_token
存在。因此,要解决此问题,您可以:
- 使用上面指定的
&.
- 调用之前调用的方法设置确认令牌
- 或者您可以手动设置一个随机确认令牌
user.update(confirmation_token: 'random text')
因为这只是一个测试,您正在检查电子邮件是否应该送达。