[Rails 5 beta4] Problem z dodaniem rekordu

Zaczynam nowy projekt a że trochę potrwa to postanowiłem zacząć już w RoR5 i od razu problem.

class User < ActiveRecord::Base
  has_secure_password
 
  validates :login, presence: true, uniqueness: true, length: {minimum: 6, maximum: 50}
  validates :email, :presence => true

  validates :password, length: { minimum: 6 }, unless: -> { password.nil? } 

  def self.authenticate(login, password)
    user = find_by login: login
    unless user
      return false
    end

    unless user.try( :authenticate, password )
          return false
        end
        
        user
  end     
      
end

I teraz chcę utworzyć w konsoli pierwszego użytkownika.

$ rails c
Loading development environment (Rails 5.0.0.beta4)
2.2.4 :001 > u=User.create({login:"root", email:"root@domain.tld", password:"1qaz2wsx", password_confirmation:"1qaz2wsx"})
   (0.1ms)  begin transaction
  User Exists (0.6ms)  SELECT  1 AS one FROM "users" WHERE "users"."login" = ? LIMIT ?  [["login", "root"], ["LIMIT", 1]]
   (0.1ms)  rollback transaction
 => #<User id: nil, login: "root", email: "root@domain.tld", password_digest: "$2a$10$QSoWWJ4F4A2j8BnoN8Iwl.NtqvzSf92rmQsfit/95vT...", roles_mask: nil, auth_token: nil, reset_password_token: nil, reset_password_send_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, blocked: false, created_at: nil, updated_at: nil> 

Co tu się dzieje? Baza jest pusta więc skąd “User Exist”?

Login ma mieć minimum 6 znaków, a ‘root’ ma 4 znaki.

Dzięki. Dobrze, że to nie boli :slight_smile:

Ale gupie te railsy swoją drogą. Dość bezsensownie jest odpalać walidator na unikalność jeśli login jest za krótki. Wiadomix, że railsy chcą walidować wszystko od razu żeby użytkownik miał szansę poprawić wszystko za jednym zamachem, ale w tym przypadku odpalanie SQL’a żeby sprawdzić unikalność jest zbędne skoro login jest za krótki, więc i tak będzie go trzeba poprawić, więc użytkownik i tak poprawiłby walidację na unikalność. Fajnie jakby kiedyś dodali takie optymalizacje.

Btw. @Tuptus jakbyś miał kiedyś problemy z takimi walidacjami, to krok dalej (po create/save) wywołaj sobie
u.errors.full_messages

Albo użyj create! wtedy w przypadku niepowodzenia będzie wyjątek.