Devise - przekierowanie po nieudanym logowaniu

Witam
Chciałbym w Devise po nieudanym logowaniu przekierowac do rejestracji a nie renderowac od nowa formularz logowania. Czy jest jakis sposób? Cos jak after_sign_in_path_for ?

A próbowałeś robić własny SessionController? Nie znam tego narzędzia ale z tego co widze Devise::SessionsController odpowiada za logowanie, wystarczy zrobić własną klase, overload create pewnie.

można “pokazać” devise’owi że ma używać innego kontrolera i tam zrobić to przekierowanie, czekaj może coś znajdę

routes.rb

[code] devise_for :users, :controllers => {:registrations => ‘registrations’, :sessions => ‘sessions’}, :path => ‘accounts’ do
get ‘login’, :to => “sessions#new”
get ‘register’, :to => “registrations#new”
get ‘sign_out’, :to => ‘sessions#destroy’

end[/code]
sessions_controller

[code]class SessionsController < Devise::SessionsController
before_filter :findusers, :only => [:create]

def findusers
    if params[:user][:email]
      user = User.find_by_email(params[:user][:email])
       if user && user.encrypted_password.empty?
            auth = []
                user.authentications.each do |aut|
                  auth << aut.provider
                end
          redirect_to new_user_session_path, :notice => t("devise.createlock")+"#{auth.join(" or ")}"+t("devise.createlock2")
      end
    end
 end

end[/code]
nie jest to dokładnie o co pytasz ale mam nadzieje że idee rozumiesz,
p.s. mam nadzieje że pomogłem przynajmniej troszkę :slight_smile:

dzięki czACHa kojarze o co chodzi, napisywałem Devisowe kontrolery czasami. Tylko że tutaj Devise zachowuje się troche inaczej, bo o nieudanym logowaniu nie dochodzi do metody z redirect

[code=ruby]class Users::SessionsController < Devise::SessionsController

def create
logger.info “tu dochodzi”
resource = warden.authenticate!(:scope => resource_name, :recall => “new”)
logger.info “tu juz nie :)”
set_flash_message :notice, :signed_in
sign_in_and_redirect(resource_name, resource)
end[/code]
Jeśli logowanie jest udane, to obie wiadomosci pokazują sie w logu, dla nieudanego tylko pierwsza. Aha, devise 1.1.8, to może mieć znaczenie bo ten gem dosyc dynamicznie sie zmienia.

Metoda warden.authenticate! w tym przypadku (braku poprawnie zalogowanego usera) przekazuje kontrole do Devise::FailureApp < ActionController::Metal.
Można to rozszerzyć

class CustomFailureApp < Devise::FailureApp def redirect_url my_new_user_path end end
i potem zaaplikowac do devise (devise.rb na samym koncu)

config.warden do |manager| manager.failure_app = CustomFailureApp end
W ten sposób sprawiasz że twoja aplikacja zawsze przy probie dostepu do chronionego zasobu przekieruje cie na strone tworzenia nowego usera (u nas jest tam i formularz logowania)

Oczywiście redirect_url może być bardziej skomplikowane…

FailureApp obsługuje też opcje :recall wiec może w twoim przypadku wystarczy użyć tego parametru.

PS

Wyszlo właśnie devise 1.2.1 z omniauth
I działa :slight_smile:

ano, z :recall => “users/registrations#new” działa ładnie :slight_smile: