3

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

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

我没有意识到我定义为私人的,我不能打电话。

这是测试

    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+\-.]+@[a-z\d\-.]+\.[a-z]+\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

谢谢

4

3 回答 3

1

这真的是对“它似乎回到 4.0.2 – jackr Jan 10 at 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 就可以让我发表评论了:)

于 2014-03-18T19:33:55.463 回答
1

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

于 2013-10-29T16:24:57.030 回答
0

根据我的类似票证中接受的答案,Rails 4 Validating email uniqueness without case_sensitive,这似乎是 MySQL 的性能和区分大小写验证之间不可调和的权衡。那里有两个 GitHub 问题的链接,这些问题显示了一些在实现上的失败,但似乎没有任何完全令人满意的解决方案。那里建议了几种解决方法。

于 2014-01-10T23:26:04.617 回答