find_or_create_by z cechą, którą obecności true w szynach

głosy
0

Mam następujący model użytkownika:

class User < ActiveRecord::Base

  validates :email, presence:true
end

Kiedy robię:

@user = User.find_or_create_by(:email => params[:email])

Robiłem @ user.nil? W celu sprawdzenia, czy użytkownik znajduje się tam, ale to nie działa jak myślałem:

puts @user.inspect
--> #<User id: nil, email: , created_at: nil, updated_at: nil>

Dlaczego użytkownik zostanie stworzony, choć nie został zapisany w DB? Jak mogę się upewnić, że @user jest „zero”? @ User.id.nil?

Dzięki

Utwórz 17/12/2013 o 15:43
użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Można zapytać, czy jest to nowy rekord poprzez:

@user.new_record?
Odpowiedział 17/12/2013 o 15:46
źródło użytkownik

głosy
1

Rekord Użytkownik nie został zapisany, ponieważ ma pusty e-mail ( „”), więc walidacja obecność zawodzi. Można sprawdzić wiadomości Błąd @user.errors.full_messages.

Z Active powołaniu rekordu .create(lub jednej z jej pochodnych) powróci nowy rekord, jeśli operacja nie powiedzie się zapisać (w tym walidacji). Jeśli chcesz błędu należy podnieść, gdy zapis jest nieważny użytkownika można użyć .create!, z hukiem (!). Proponuję to nowsze składni, który jest kompatybilny z Rails 4:

# Raises an Error if no matching record is found and the new record fails to save.
@user = User.where(:email => params[:email]).first_or_create!

# Does not raise an error if new record fails to save. The returned object will be a new record with post-validation error states.
@user = User.where(:email => params[:email]).first_or_create

Wybranej metody zależy od tego, jak chcesz, aby aplikacja zachowywać.

Odpowiedział 17/12/2013 o 16:28
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more