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

これは、Ruby 2 を使用した Rails 3.2.12 のバグでした。このhttps://github.com/rails/rails/issues/9417をご覧ください。Rails 3.2.15 に切り替えると、問題が解決するはずです。

于 2013-10-29T16:24:57.030 に答える
1

これは実際には「4.0.2 に戻ったようです – jackr 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でコメントできるように十分なポイントを獲得できるように、いくつかの賛成票をいただければ幸いです:)

于 2014-03-18T19:33:55.463 に答える
0

私の同様のチケットRails 4 Validating email uniqueness without case_sensitiveで受け入れられた回答によると、これは MySQL のパフォーマンスと大文字と小文字を区別する検証の間の相容れないトレードオフのようです。GitHub の 2 つの問題へのリンクがあり、実装でいくつかのフリップ フロップが見られますが、完全に満足できる解決策はないようです。そこでは、いくつかの回避策が提案されています。

于 2014-01-10T23:26:04.617 に答える