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ę
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
ano, z :recall => “users/registrations#new” działa ładnie