2012-03-12 35 views
7

Tôi đang chạy "đường ray giao diện điều khiển" và sau đó lệnh sau:Dữ liệu không vào cơ sở dữ liệu SQLite - Ruby on Rails

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

và tôi có được điều này:

(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..."> 

khi tôi kiểm tra các tập tin của cơ sở dữ liệu sqlite bằng cách sử dụng trình duyệt Cơ sở dữ liệu SQLite Tôi không thấy gì cả.

đây là mô hình người dùng của tôi:

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 

tại sao dữ liệu không được nhập vào cơ sở dữ liệu của tôi?

Tôi gặp lỗi này với bất kỳ điều gì tôi nhập!

này ví dụ:

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..."> 

tôi không bao giờ bước vào một người dùng Smith với email đó, và tôi vẫn nhận được rằng "người dùng tồn tại"!

CHỈNH SỬA:

Tôi gặp lỗi. Giới hạn mật khẩu là 5 tôi đã nhập một mật khẩu 3 chữ vì vậy khi tôi gõ này:

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..."> 

tôi làm việc, nhưng tôi vẫn nhận được tài lạ này Tồn tại lỗi ... Bất cứ ý tưởng?

+1

Có vẻ như bạn đã có người dùng với email 'test @ email.com' để xác thực ': duy nhất' cho email không thành công. – pjumble

+0

đã chỉnh sửa câu hỏi của tôi –

+1

Bạn nhận được kết quả gì nếu bạn: 'user = User.new (tên:" Smith ", email:" [email protected] ", mật khẩu:" foo ", password_confirmation:" foo ")' và sau đó: 'đặt user.errors'? – pjumble

Trả lời

1

Bạn đang cố gắng tạo hàng trùng lặp trong cơ sở dữ liệu có xác thực duy nhất. Thấy thông báo lỗi của bạn ("Người dùng Tồn tại"):

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

thấy dòng trong mô hình của bạn:

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

Nó xác nhận rằng địa chỉ email của người dùng là duy nhất. Vì vậy, bạn phải có một hàng trong cơ sở dữ liệu với "[email protected]" làm địa chỉ email.

+0

đã chỉnh sửa câu hỏi của tôi –

1

Có thể bạn đang tìm kiếm cơ sở dữ liệu sai. Đây là ứng dụng đường ray. và nhìn vào schema balbla.development trong cơ sở dữ liệu vì không có cách về vấn đề của bạn rằng phải có một hàng có giá trị cùng một email

1

Tôi không chắc chắn 100% nhưng tôi nghĩ

người dùng tồn tại (0,4ms) CHỌN 1 TỪ "người dùng" CÓ LOWER ("người dùng". "Email") = LOWER ('[email protected] ') LIMIT 1

chỉ kiểm tra tính duy nhất ở chỗ nó sẽ chạy bất kể bạn có truy vấn sẽ vượt qua hoặc thất bại.

Nếu bạn chú ý hơn đến kết quả, bạn sẽ nhận ra rằng kết quả thành công sẽ hiển thị 'Người dùng tồn tại' màu xanh lam, trong khi kết quả không thành công khi bạn thực sự cố gắng chèn người dùng trùng lặp sẽ hiển thị 'Người dùng tồn tại' màu đỏ (hoặc màu tím trong trường hợp của tôi).

Ryan

1

tôi gặp phải vấn đề này quá, vì mật khẩu của tôi là không dài hơn 6. Vì vậy, tôi đã thay đổi nó để một trong những lâu hơn, nó làm việc.Nhưng tôi không biết tại sao ngoại lệ này có tên là "Người dùng tồn tại" hoặc
Có vấn đề gì đó với tôi. BYW, tôi không mở Trình duyệt cơ sở dữ liệu SQLIte.

8

Chỉ cần truy cập bằng Google Tìm kiếm và tìm thấy vấn đề là gì. Trong thực tế, nó là một thông báo lỗi rác. Ngay cả với một cơ sở dữ liệu sạch sẽ nó sẽ xuất hiện. Vấn đề là: mật khẩu chỉ dài 3 ký tự, sẽ gây ra sự cố với

validates :password, length: {minimum: 6} 

Vì vậy, nếu bạn thử với mật khẩu dài hơn (và xác nhận) nó sẽ hoạt động. (PS: Tôi đang sử dụng máy chủ MySQL, không phải SQLite, nhưng tôi chắc chắn rằng lỗi này giống nhau)

+1

Đây là giải pháp cho tôi. Tôi đã nhận được lỗi vì mật khẩu của tôi là một ký tự quá ngắn. Tốt bắt Arthur! – thomallen

+0

Cảm ơn Arthur! Các thông báo lỗi hút thực sự. –

+0

Tôi nghĩ rằng '" @messages = {: password => ["là quá ngắn (tối thiểu là 6 ký tự)"]} "' là khá rõ ràng thực sự. – ocodo

1

Đó là mật khẩu.

Nếu bạn muốn kiểm tra các lỗi làm điều này:

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

user.save 

user.errors 
8
  1. user = User.new

  2. thiết lập các lĩnh vực trên user

  3. user.save

  4. nhìn tại user.errors

+1

Kiểm tra 'user.errors' là câu trả lời. Có rất nhiều thứ khác nhau có thể sai. – pyrospade

+0

Tốt hơn, hãy viết một bài kiểm tra rspec. – ocodo

+0

Thật không may, điều đó sẽ không thực sự giúp bạn hiểu * những gì * đã đi sai, chỉ là một cái gì đó đã làm. Nếu bạn đã viết một bài kiểm tra, bạn sẽ muốn nó được ném vào 'user.errors'. – pyrospade

2

Trong thực tế, vấn đề không phải là "người dùng tồn tại", và lý do thực sự là mật khẩu quá ngắn. Bạn có thể hiển thị lỗi bằng cách nhập user.errors trên bảng điều khiển đường ray.

vui lòng tham khảo ví dụ lỗi sau.

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> 

Nếu tôi thay đổi mật khẩu từ "quản trị" thành "admin123" và không có gì sai.

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> 
Các vấn đề liên quan