Вопрос

Это не какая-то проблема синхронизации, которую я прочитал раньше. Код довольно прост. Модель:

class User < ActiveRecord::Base
    attr_accessor :name, :email
    validates_uniqueness_of :email, :on => :create, :message => "must be unique"
 end

Тест RSPEC:

require 'spec_helper'
describe User do
    before(:each) do
       @valid_attributes = {
           :name => "Foo Bar",
           :email => "foo@bar.com"
        }
     end  
    it "should reject duplcate email address" do
        User.create!(@valid_attributes)
        duplicate_user = User.new(@valid_attributes)
        duplicate_user.should_not be_valid
     end
  end

Я запускаю тест и получите сообщение об ошибке:

----------------------------
1)
'User should reject duplcate email address' FAILED
expected #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil> not to be valid
/Users/mac/workspace/rails_space/uniq/spec/models/user_spec.rb:14:

Finished in 0.067908 seconds

1 example, 1 failure
-----------------------------

Я запускаю скрипт / консоль и создаю два пользовательских объекта с тем же адресом электронной почты. Он идет нормально, отсутствие не возникает проверки, два объекта вставили в таблицу. Я не то, что с этим не так.

Моя версия Rails - 2.3.8, а RSPC - 1.3.0.

Это было полезно?

Решение

Я считаю, что проблема в attr_accessor линия, которую у вас есть. Если у вас есть те имена столбцов, Accessor переопределят имя столбца, и это просто часть класса и не заботится о уникальности. Если вы собираетесь иметь методы доступа, то он должен вернуться в базу данных каким-то образом. Если вам нужно иметь аксессуар, то вам нужно связать его в базу данных, позвонив write_attribute.

Для получения дополнительной информации вы можете увидеть документацию для «перезаписи доступа по умолчанию» в http://api.rubyonrails.org/Classes/activerecord/base.html.

Надеюсь, это поможет!

Другие советы

Я думаю, что проблема заключается в том, что вы говорите:

validates_uniqueness_of :email, :on => :create

User.new может не запускать эту проверку. Попробуйте позвонить Duplicate_user.save! и посмотрите, что это бросает ошибку.

Вы можете попробовать, как следующие

attr_accessible :email
validates_uniqueness_of :email, :on => :create, :message => "must be unique"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top