2013-10-14 6 views
1

Я абсолютно не знаком с Rails, я почти не знаю, что делаю. Но. Проблема заключается в том: подписание до нового пользователя с результатами DEViSE в:SQLite3 :: ConstraintException: адрес электронной почты не уникален

SQLite3::ConstraintException: column email is not unique: 
INSERT INTO "users" ("created_at","encrypted_password", "name", "updated_at") 
VALUES (?, ?, ?, ?) 

И запрос параметров: модель

{"utf8"=>"✓", 
"authenticity_token"=>"1bgk4ovS3JitphVkIvcCZi3ex8QsBq4eEf6ZihQLiHg=", 
"user"=>{"name"=>"Someone", 
"email"=>"[email protected]", 
"password"=>"[FILTERED]"}, 
"commit"=>"Sign up"} 

Пользователь:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable; 
end 

DB миграция:

class DeviseCreateUsers < ActiveRecord::Migration 
    def self.up 
    change_table(:users) do |t| 
     ## Database authenticatable 
     t.string :email,    :null => false, :default => "" 
     t.string :name,    :null => false, :default => "" 
     t.string :encrypted_password, :null => false, :default => "" 

     ## Recoverable 
     t.string :reset_password_token 
     t.datetime :reset_password_sent_at 

     ## Rememberable 
     t.datetime :remember_created_at 

     ## Trackable 
     t.integer :sign_in_count, :default => 0 
     t.datetime :current_sign_in_at 
     t.datetime :last_sign_in_at 
     t.string :current_sign_in_ip 
     t.string :last_sign_in_ip 

     ## Confirmable 
     # t.string :confirmation_token 
     # t.datetime :confirmed_at 
     # t.datetime :confirmation_sent_at 
     # t.string :unconfirmed_email # Only if using reconfirmable 

     ## Lockable 
     # t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts 
     # t.string :unlock_token # Only if unlock strategy is :email or :both 
     # t.datetime :locked_at 

     ## Token authenticatable 
     # t.string :authentication_token 


     # Uncomment below if timestamps were not included in your original model. 
     # t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :name,     :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    # add_index :users, :authentication_token, :unique => true 
    end 

    def self.down 
    # By default, we don't want to make any assumption about how to roll back a migration when your 
    # model already existed. Please edit below which fields you would like to remove in this migration. 
    end 
end 

Скажите, пожалуйста, если Мне нужно предоставить любой другой код. И спасибо за вашу помощь заранее.

Обновление с БД схеме:

ActiveRecord::Schema.define(version: 20131012114812) do 

    create_table "users", force: true do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "name" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

end 

Update 2: И есть также проблема с аутентификацией. Devise сообщает «Недействительный адрес электронной почты или пароль» для любого ранее успешно зарегистрированного пользователя при попытке входа в систему.

+1

Похоже, вы испытываете такую ​​же проблему: HTTP: // StackOverflow.com/questions/5769758/add-index-to-email-column-culprit-for-unit-tests-failing – Dave

+0

Hm. Попробуйте [drop] (http://stackoverflow.com/questions/4020131/rails-db-migration-how-to-drop-a-table) таблицу пользователей. Это то, что вы должны ** не делать, но это может вам помочь. – user2422869

+0

@Dave Devise отлично работает после установки. Так что я не верю. –

ответ

1

Попробуйте добавить проверку уникальности вашей User модели:

validates_uniqueness_of :email, :allow_blank => true 

Это будет повторно отрендерить пользователя форму создания вместо возникновения ошибки.

+0

Пробовал, что. Представьте, что ошибка «Электронная почта уже была принята». Приведенное электронное письмо является абсолютно новым для приложения, конечно. –

+0

@ VladislavIvanov Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что она обеспечивает уникальность электронной почты, но если вы хотите, чтобы в электронном письме было пустое значение по умолчанию, вам нужно будет использовать ': allow_blank => true' для принятия пустых значений. См. Мой обновленный ответ выше и, надеюсь, это сработает для вас. – jvperrin

+0

Спасибо за совет, но теперь я получаю сообщение об ошибке «SQLite3 :: ConstraintException: адрес электронной почты столбца не уникален: INSERT INTO« пользователи »(« created_at »,« encrypted_password »,« name »,« updated_at ») VALUES (?,?,?,?) ' –

1

У вас есть другие столбцы «электронной почты» в этой базе данных?

Возможно, у вас уже есть таблица «users», где столбец электронной почты был реплицирован с помощью Devise. Было бы полезно, если бы вы могли показать нам, какие столбцы у вашей таблицы есть :)

+0

Спасибо, я обновил вопрос. –

+1

SQLite3 :: ConstraintException: адрес электронной почты столбца не уникален: INSERT INTO «пользователи» («created_at», «encrypted_password», «name», «updated_at») VALUES (?,?,?,?) -> выглядит вы не вставляете электронное письмо с этим запросом? Может ли это быть проблема? –

+0

Как это проверить? Я, кстати, настоящий новичок :-) –

4

SQLite сообщает вам, что он пытается создать новую запись, где одним из значений будет электронное письмо, но уже есть существующая запись с этим электронным письмом.

Простой способ чтения записей базы данных является запрос к БД в окне терминала:

$ rails console 
$ User.all 

Если вы хотите увидеть тестовую БД, который будет загружен с сантехникой:

$ rails console -e=test 
$ User.all 

Ищите записи, которые имеют тот же адрес электронной почты, который вы пытаетесь создать.

Если вы впервые используете Devise, вы должны проверить свои приборы. В настоящее время в разработке установлено два устройства, которые не имеют атрибутов. Если вы работаете в тестовой среде, то эти приборы будут загружены в тестовую БД в виде двух записей с нулевыми значениями для электронной почты, которые являются повторяющимися значениями электронной почты. Светильники, подобные приведенным ниже, помогут вам передать сообщение об ошибке.

file: app/test/fixtures/users.yml 

one: 
    email: [email protected] 
    encrypted_password: password1 

two: 
    email: [email protected] 
    encrypted_password: password2 
Смежные вопросы