2012-03-12 11 views
7

używam "Szyny konsoli", a następnie polecenie:Dane nie wprowadzając sqlite bazy danych - Ruby on Rails

User.create(name:"John", email:"[email protected]", password:"foo", password_confirmation:"foo") 

i uzyskać to:

(0.1ms) begin transaction 
    User Exists (0.2ms) SELECT 1 FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    (0.1ms) rollback transaction 
=> #<User id: nil, name: "John", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$mY0/9RgjwOU46ZYcSC0TFOCMxrPiqWTEHWe1K27O/3Ya..."> 

kiedy sprawdzić plik baza danych sqlite za pomocą przeglądarki SQLite Database Nie widzę nic.

tutaj jest mój model użytkownik:

class User < ActiveRecord::Base 

    #these attributes can be modified by the users 
    attr_accessible :name, :email, :password, :password_confirmation 
    #ruby's way of calling a method below... 
    has_secure_password 

    #validation testing 
    validates :name, presence: true, length: { maximum: 50 } 
    #regular expression (there is an official one) 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    #and add it.. 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
     uniqueness: { case_sensitive: false } 
    #validate password 
    validates :password, length: {minimum: 6} 
    validates :password_confirmation, presence: true 

end 

dlaczego nie dane wpisane w mojej bazy danych?

Otrzymuję ten błąd przy każdym wejściu!

to na przykład:

1.9.3p125 :005 > User.create(name:"Smith", email:"[email protected]", password:"foo", password_confirmation:"foo") 
    (0.1ms) begin transaction 
    User Exists (0.1ms) SELECT 1 FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    (0.0ms) rollback transaction 
=> #<User id: nil, name: "Smith", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$6nzyRJ0IplI6B4bSoQEtUOIcrbFVl1ix3EAKPGJZjZQf..."> 

nigdy nie wszedł użytkownika Smith z tego e-maila, a ja wciąż się, że „Użytkownik nie istnieje”!

EDYTOWANIE:

Dostałem błąd. Limit hasło jest 5 Byłem wprowadzeniu hasła 3-literowy więc kiedy wpisz:

User.create(name:"Smith", email:"[email protected]", password:"foobar", password_confirmation:"foobar") 
    (0.1ms) begin transaction 
    User Exists (0.2ms) SELECT 1 FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
Binary data inserted for `string` type on column `password_digest` 
    SQL (1.7ms) INSERT INTO "users" ("created_at", "email", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Mon, 12 Mar 2012 00:16:42 UTC +00:00], ["email", "[email protected]"], ["name", "Smith"], ["password_digest", "$2a$10$v/FqAuUPpbdIJ44jVHxbKOJt/uoBTJVkP4KIhzJHNcF8rWPFfKusi"], ["updated_at", Mon, 12 Mar 2012 00:16:42 UTC +00:00]] 
    (266.9ms) commit transaction 
=> #<User id: 1, name: "Smith", email: "[email protected]", created_at: "2012-03-12 00:16:42", updated_at: "2012-03-12 00:16:42", password_digest: "$2a$10$v/FqAuUPpbdIJ44jVHxbKOJt/uoBTJVkP4KIhzJHNcF8..."> 

I działa, ale ja wciąż dostać ten dziwny użytkownik istnieje błąd ... Jakieś pomysły?

+1

Wygląda na to masz już użytkownikowi email 'testowej @ email.com' więc': uniqueness' walidacji e-mail jest wadliwa. – pjumble

+0

edytowałem moje pytanie –

+1

Jakie wyjście otrzymasz, jeśli wykonasz: 'user = User.new (nazwa:" Smith ", email:" [email protected] ", hasło:" foo ", password_confirmation:" foo ")' a następnie: 'puts user.errors'? – pjumble

Odpowiedz

1

Próbujesz utworzyć duplikat wiersza w bazie danych, w której istnieje jednoznaczne sprawdzanie poprawności. Zapoznaj się komunikat o błędzie („Użytkownik nie istnieje”):

User Exists (0.2ms) SELECT 1 FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 

zobaczyć linię w modelu:

validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
    uniqueness: { case_sensitive: false } 

To sprawdzanie, czy adres e-mail użytkownika jest unikatowy. Więc musisz już mieć wiersz w bazie danych z "[email protected]" jako adres e-mail.

+0

zredagowałem moje pytanie –

1

Może szukasz niewłaściwej bazy danych. To jest aplikacja rails. i spojrzeć na schemacie balbla.development w bazie danych, ponieważ nie ma mowy o swoim problemie, który nie musi być rząd, który ma taką samą wartość email

1

nie jestem w 100% pewien, ale myślę

użytkownik istnieje (0,4 ms) WYBIERZ 1 OD "UŻYTKOWNIKÓW" GDZIE NIŻSZY ("Użytkownicy". "E-mail") = NIŻSZY ('[email protected]ład.com ') LIMIT 1

ogranicza się do sprawdzenia unikalności pod tym względem, że będzie działał niezależnie od tego, czy zapytanie zostanie przekazane lub nie.

Jeśli zwrócisz baczniejszą uwagę na wyniki, uświadomisz sobie, że pomyślny wynik spowoduje wyświetlenie "User Exists" na niebiesko, a nieudany wynik podczas próby wstawienia duplikatu użytkownika spowoduje wyświetlenie "User Exists" w czerwony (lub fioletowy w moim przypadku).

Ryan

1

I napotkał ten problem też, bo z moim hasłem jest nie dłuższy niż 6. Więc zmieniłem go na dłużej jeden, to działało.Ale nie wiedziałem, dlaczego ten wyjątek o nazwie "Użytkownik istniał" lub
Coś nie tak ze mną. BYW, nie otworzyłem SQLIte Database Browser.

8

Właśnie tu przy użyciu wyszukiwarki Google i znaleźliśmy problem. W rzeczywistości jest to komunikat o błędzie śmieci. Nawet z czystą bazą danych by się pojawiła. Problem polega na tym: hasło ma tylko 3 znaki, wich spowoduje problem z

validates :password, length: {minimum: 6} 

Więc jeśli starają się już hasła (i potwierdzeniu) powinno działać. (PS: Używam serwera MySQL, nie SQLite, ale jestem pewien, że błąd jest taki sam)

+1

To było rozwiązanie dla mnie. Wystąpił błąd, ponieważ moje hasło było zbyt krótkie. Dobry połów, Arturze! – thomallen

+0

Dzięki Arthur! Komunikat o błędzie jest naprawdę zasysany. –

+0

Myślę, że '" @messages = {: hasło => ["jest za krótkie (minimum to 6 znaków)"]} "' jest całkiem jasne. – ocodo

1

To jest hasło.

Jeśli chcesz sprawdzić błędy to zrobić:

user = User.new(name:"John", email:"[email protected]", password:"foo", 
password_confirmation:"foo") 

user.save 

user.errors 
8
  1. user = User.new

  2. ustawić pola na user

  3. user.save

  4. przeglądowej na user.errors

+1

Sprawdzanie 'user.errors' jest odpowiedzią. Jest tak wiele różnych rzeczy, które mogą pójść nie tak. – pyrospade

+0

Jeszcze lepiej, napisz test rspec. – ocodo

+0

Niestety, to naprawdę nie pomoże ci zrozumieć, * co * poszło nie tak, po prostu coś się stało. Jeśli napisałeś test, chciałbyś, aby rzucił to, co było w "user.errors". – pyrospade

2

W rzeczywistości problem nie jest „użytkownik istnieje”, a prawdziwym powodem jest to, że hasło jest zbyt krótkie. Możesz pokazać błędy, wprowadzając user.errors na konsoli rails.

Proszę zapoznać się z poniższym przykładem błędu.

irb(main):013:0> user = User.new(name:"caiqinghua", email:"[email protected]", password:"admin",password_confirmation:"admin") 

=> #<User id: nil, name: "caiqinghua", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$1d5jtpdkpl9hJPr/8s/dku1Y34.Aft/cAP5h/wrTN2sL..."> 
irb(main):014:0> user.save 
    (0.2ms) begin transaction 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    (0.2ms) rollback transaction 
=> false 
irb(main):015:0> User.all 
    User Load (0.6ms) SELECT "users".* FROM "users" 
=> #<ActiveRecord::Relation []> 
irb(main):016:0> User.create(name:"caiqing", email:"[email protected]", password:"admin",password_confirmation:"admin") 
    (0.3ms) begin transaction 
    User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    (0.1ms) rollback transaction 
=> #<User id: nil, name: "caiqing", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$Ossfc7NsL6/MjYVEjT5rJe/y4AiqdNZI2tCkrN1h8rHx..."> 

**irb(main):017:0> user.errors** 
=> #<ActiveModel::Errors:0xba7d34c0 @base=#<User id: nil, name: "caiqinghua", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$1d5jtpdkpl9hJPr/8s/dku1Y34.Aft/cAP5h/wrTN2sL...">, @messages={:password=>["is too short (minimum is 6 characters)"]}> 
irb(main):018:0> 

Gdybym zmienił hasło z "admin" na "admin123", i nic nie jest źle.

irb(main):018:0> 
irb(main):019:0* user = User.new(name:"caiqinghua", email:"[email protected]", password:"admin123",password_confirmation:"admin123") 
=> #<User id: nil, name: "caiqinghua", email: "[email protected]", created_at: nil, updated_at: nil, password_digest: "$2a$10$dHb.jezaiomN.ZE0pazkOOHDdac/K386h7zsORF93HtQ..."> 
irb(main):020:0> user.save 
    (33.7ms) begin transaction 
    User Exists (9.9ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
Binary data inserted for `string` type on column `password_digest` 
    SQL (108.8ms) INSERT INTO "users" ("created_at", "email", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", Fri, 27 Sep 2013 15:25:27 UTC +00:00], ["email", "[email protected]"], ["name", "caiqinghua"], ["password_digest", "$2a$10$dHb.jezaiomN.ZE0pazkOOHDdac/K386h7zsORF93HtQb7wtj73Ha"], ["updated_at", Fri, 27 Sep 2013 15:25:27 UTC +00:00]] 
    (112.7ms) commit transaction 
=> true 
irb(main):021:0> User.all 
    User Load (0.6ms) SELECT "users".* FROM "users" 
=> #<ActiveRecord::Relation [#<User id: 2, name: "caiqinghua", email: "[email protected]", created_at: "2013-09-27 15:25:27", updated_at: "2013-09-27 15:25:27", password_digest: "$2a$10$dHb.jezaiomN.ZE0pazkOOHDdac/K386h7zsORF93HtQ...">]> 
irb(main):022:0>