Logowanie po drugim razie ;)

Mam taki oto problem. Do dalszych elementów strony mogę zalogować się dopiero po drugim wpisaniu prawidłowego loginu i hasła (upewniałem się, że za pierwszy razem podaje dobry).

Kod kontrolera, który obsługuje logowanie:

  def create
	login_user = Employee.find_by(:email=> params[:email], : password=> params[: password])

	if login_user
		session[:user] = login_user
		redirect_to employee_time_offs_path(:employee_id => login_user.id)
	else
		redirect_to root_path
	end
end

Za pierwszym razem wchodzi do metody create, znajduje usera ale generuje url do roota, dopiero za drugim razem przechodzi do prawidłowej strony.

Macie jaki pomysł dlaczego? Z góry dziękuje za pomoc :smile:

  1. zamiast find_by dałbym where(…).first
  2. w session trzymałbym user.id a nie całe user

Dlaczego własny system logowania, a nie na przykład Devise? Wydaje mi się, że to drugie jest zazwyczaj dużo bezpieczniejszym wyjściem.

Devise przy prostej stronie jest ok, ale przy bardziej skomplikowanej, za dużo rzeczy trzeba ustawiać. Zakładam, że autor podał przykładowy (uproszczony) kod kontrolera, więc nie ma tutaj nic dziwnego.

@wafcio - fragment kodu railsów:

def find_by(*args)
  where(*args).first
end

Generalnie metoda find_by została dodana w rails4, jak najbardziej należy jej używać :slight_smile:

Zgadzam się z drugim punktem, @lsol dlaczego trzymasz cały obiekt w sesji?

Co do samego problemu - skoro login_user jest znajdowany, to na pewno kod wchodzi do pierwszej opcji w warunku, więc zapewne przy redirect_to idzie do ścieżki employee_time_offs_path, i tam filtr, który sprawdza czy użytkownik jest zalogowany, stwierdza, że nie jest i robi redirect do root_path. Sprawdź co się dzieje w tym filtrze, czy session[:user] jest tam poprawne.