Ruby on Rails教程 – Michael Hartl – 测试“用户何时收到电子邮件地址”

我对“已经使用电子邮件地址的用户”的测试有问题,这是我运行测试时显示的内容

1) User when email address is already taken Failure/Error: user_with_same_email = @user.dup NoMethodError: private method `initialize_dup' called for # # ./spec/models/user_spec.rb:78:in `block (3 levels) in ' 

我没有意识到我所定义的是私人,我无法打电话。

这是测试

  describe "when email address is already taken" do before do user_with_same_email = @user.dup user_with_same_email.email = @user.email.upcase user_with_same_email.save end it { should_not be_valid } end 

这里是用户模型

 class User < ActiveRecord::Base attr_accessible :email, :name, :password, :password_confirmation has_secure_password has_many :microposts, dependent: :destroy before_save { self.email.downcase! } before_save :create_remember_token VALID_EMAIL_REGEX = /\A[\w+\-.]+@[az\d\-.]+\.[az]+\z/i validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } validates :name, presence: true, length: { maximum: 50} validates :password, length: { minimum: 6 } validates :password_confirmation, presence: true private def create_remember_token self.remember_token = SecureRandom.urlsafe_base64 end end 

谢谢

这是Rails 3.2.12中的一个带有ruby 2的错误。看看这个https://github.com/rails/rails/issues/9417 。 切换到Rails 3.2.15应该可以解决您的问题。

这真的是一个评论“似乎回到4.0.2 – 1月10日22:58杰克”:

我所做的就是强迫它公开:

 @my_object.errors.class_eval do def initialize_dup(other) # :nodoc: @messages = other.messages.dup super end end @my_object.errors.initialize_dup(another_object.errors) 

我会感谢一些投票,这样我就可以获得足够的分数,以便stackoverflow允许我发表评论:)

根据我的类似票证中接受的答案, Rails 4validation电子邮件唯一性而不使用case_sensitive ,这似乎是对MySQL的性能和区分大小写的validation之间的不可调和的折衷。 有两个GitHub问题的链接显示了实现的一些翻转,但似乎没有任何完全令人满意的解决方案。 这里建议了几种解决方法。