Ruby on rails 如何在运行时创建有效邮件";User.create";从Rails 6控制台

Ruby on rails 如何在运行时创建有效邮件";User.create";从Rails 6控制台,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在学习Michael Hartl的教程,当我试图在我的users表中创建用户时,遇到了一个问题 当我从Rails控制台运行User.create时,我总是得到: @messages={:email=>["is invalid"]}" 从user.errors。我的测试也失败了: FAIL["test_email_validation_should_accept_valid_addresses",

我正在学习Michael Hartl的教程,当我试图在我的
users
表中创建用户时,遇到了一个问题

当我从Rails控制台运行
User.create
时,我总是得到:

@messages={:email=>["is invalid"]}"
user.errors
。我的测试也失败了:

FAIL["test_email_validation_should_accept_valid_addresses",                                             #<Minitest::Reporters::Suite:0x00007f66146c67f0 @name="UserTest">, 0.05937384600110818]
 test_email_validation_should_accept_valid_addresses#UserTest (0.06s)
        "lala@example.com" should be valid
如果我这样写,测试通过:

test "should be valid" do
  assert_not @user.valid?
end
这也失败了:

test "email validation should accept valid addresses" do
  valid_addresses = %w[lala@example.com USER@foo.COM A_US-ER@foo.bar.org first.last@foo.jp alice+bob@baz.cn]
  valid_addresses.each do |valid_address|
    @user.email = valid_address
    assert @user.valid?, "#{valid_address.inspect} should be valid"
  end
end
如果我这样编写测试,它将通过:

test "email validation should accept valid addresses" do
  valid_addresses = %w[lala@example.com USER@foo.COM A_US-ER@foo.bar.org
                         first.last@foo.jp alice+bob@baz.cn]
  valid_addresses.each do |valid_address|
    @user.email = valid_address
    assert_not @user.valid?, "#{valid_address.inspect} should be valid"
  end
end 
以下是保护错误:

FAIL["test_email_validation_should_accept_valid_addresses", #<Minitest::Reporters::Suite:0x00007f6614891a58 @name="UserTest">, 0.05828664900036529]
 test_email_validation_should_accept_valid_addresses#UserTest (0.06s)
        "lala@example.com" should be valid
        test/models/user_test.rb:39:in `block (2 levels) in <class:UserTest>'
        test/models/user_test.rb:37:in `each'
        test/models/user_test.rb:37:in `block in <class:UserTest>'

 FAIL["test_should_be_valid", #<Minitest::Reporters::Suite:0x00007f6614859ab8 @name="UserTest">, 0.06591933299932862]
 test_should_be_valid#UserTest (0.07s)
        Expected false to be truthy.
        test/models/user_test.rb:11:in `block in <class:UserTest>'

:format
通过测试属性值是否与使用
:with
选项指定的给定正则表达式匹配来验证属性值

保存正则表达式,用于将模式与字符串匹配。regexp是使用
/…/

您的regexp是
/VALID\u EMAIL\u REGEX/
。这意味着有效的电子邮件必须包含这些符号

因此,您的代码意味着
“有效的\u电子邮件_REGEX@gmail.com
有效,但
example@gmail.com“
无效

事实上,regexp
VALID\u EMAIL\u REGEX
中有常量

因此,您需要将代码更改为:

format: { with: VALID_EMAIL_REGEX }
(带有regexp的常量,而不是regexp)

顺便说一下,您不需要为电子邮件编写困难的正则表达式。您可以使用标准库中的正则表达式:

format: { with: URI::MailTo::EMAIL_REGEXP }

尝试从您的
验证行中的
/
选项中删除
/
/
,如
验证:电子邮件,…,格式:{with:VALID\u email\u REGEX}
确保您的问题中包含可复制的行为,例如。,与
User.create
一起使用的确切命令,包括所有参数。在测试单个验证时,不要使用assert@model.valid?。这是一个巨大的反模式,只会邀请虚假的帖子/否定。有效吗?如果所有验证都通过,则为true;如果任何验证失败,则为false。仅仅因为它出现在书中并不意味着它是个好主意。相反,您应该调用valid?要在对象上运行验证并测试错误对象,例如
assert\u includes(“不能为空”,user.errors.messages[:name])
非常感谢删除/。/完成了这个技巧。并修复了所有测试失败的问题。我已经为此挣扎了6天了。
class User < ApplicationRecord
  before_save { self.email = email.downcase}
  validates :name, presence: true, length: {maximum: 50}
  VALID_EMAIL_REGEX = /[\w+\-.]+@[a-z\-.]+\.[a-z]+/i
  validates :email, presence: true, length: { maximum: 255},
            format: { with: /VALID_EMAIL_REGEX/},
            uniqueness: false
  has_secure_password
  validates :password, presence:true, length: { minimum: 6}
end
format: { with: VALID_EMAIL_REGEX }
format: { with: URI::MailTo::EMAIL_REGEXP }