测试“用户何时已收到电子邮件地址”时出现问题,以下是我运行测试时显示的内容
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
谢谢
答案 0 :(得分:1)
这是Rails 3.2.12中的一个带有ruby 2的错误。看看这个https://github.com/rails/rails/issues/9417。切换到Rails 3.2.15可以解决您的问题。
答案 1 :(得分:1)
这真的是对#34的评论;它似乎又回到了4.0.2 - 1月10日22:58&#34;
我所做的就是强迫它公开:
@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允许我发表评论:)
答案 2 :(得分:0)
根据我的类似票证Rails 4 Validating email uniqueness without case_sensitive中接受的答案,这似乎是对MySQL的性能和区分大小写的验证之间的不可调和的折衷。有两个GitHub问题的链接显示实现的一些翻转,但似乎没有任何完全令人满意的解决方案可能。这里有几种解决方法。