即使我的方法 returns 为零,我的 before_create 也不起作用。

my before_create isn't working even though my method returns nil.

这是我的用户 class:

class User < ActiveRecord::Base
  has_secure_password

  before_save :valid_email?

  validates :username, presence: true,
                       uniqueness: true
  validates :first_name, presence: true

  enum role: [ :flyer, :admin ]

  def valid_email?
    email_checker
  end

  private

  def email_checker
    self.email.match(/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$/)
  end

end

这是我的测试:

test "if a user has an invalid email, cannot be saved" do
    user = build(:user)
    user1 = build(:user, email: "here@here@here")
    user2 = build(:user, email: "here.here@here")

    assert user.save
    refute user1.save
    refute user2.save
  end

如果电子邮件是 here@here@here 或 here.here@here,email_checker 方法会 return nil。那么这是怎么回事?

因为你只是调用了self.email.match方法。如果你想验证归档你应该使用或创建验证器。

在您的情况下,您可以创建 own custom validator or use e-mail validator from gems (i.e email_validator)。