Actually, the problem is not with Custom Exists, and the real reason is that the password is too short. You can show errors by typing user.errors in the rails console.
refer to the following error example.
irb(main):013:0> user = User.new(name:"caiqinghua", email:" caiqinghua@126.com ", password:"admin",password_confirmation:"admin") => #<User id: nil, name: "caiqinghua", email: " caiqinghua@126.com ", 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(' caiqinghua@126.com ') 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:" caiqing@126.com ", password:"admin",password_confirmation:"admin") (0.3ms) begin transaction User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(' caiqing@126.com ') LIMIT 1 (0.1ms) rollback transaction => #<User id: nil, name: "caiqing", email: " caiqing@126.com ", 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: " caiqinghua@126.com ", 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>
If I changed the password from “admin” to “admin123” and nothing happened.
irb(main):018:0> irb(main):019:0* user = User.new(name:"caiqinghua", email:" caiqinghua@126.com ", password:"admin123",password_confirmation:"admin123") => #<User id: nil, name: "caiqinghua", email: " caiqinghua@126.com ", 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(' caiqinghua@126.com ') 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", " caiqinghua@126.com "], ["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: " caiqinghua@126.com ", 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>