Перенаправление проблем, когда пользователь не может войти в систему с помощью приложения
В моем приложении я аутентифицирую пользователей с помощью Devise, и я заметил, что вы можете изменить страницу, на которую перенаправляется, если сбой входа. В wiki я нашел следующий пример:
class CustomFailure < Devise::FailureApp
def redirect_url
new_user_session_url(:subdomain => 'secure')
end
# You need to override respond to eliminate recall
def respond
if http_auth?
http_auth
else
redirect
end
end
end
Следуя этому примеру, я создал свой собственный класс CustomFailure (custom_failure.rb) и помещен в вспомогательную папку (не уверен, куда ее поместить). Это следующий класс, который я создал:
class CustomFailure < Devise::FailureApp
def redirect_url
new_user_session_url(:subdomain => 'secure')
end
# Redirect to root_url
def respond
if http_auth?
http_auth
else
root_url
end
end
end
Я также добавил следующее в файле config/initializers/devise.rb(поскольку состояния wiki должны быть выполнены):
config.warden do |manager|
manager.failure_app = CustomFailure
end
Хотя я не получаю ошибок, когда я неправильно вхожу, он все же перенаправляется на страницу /users/sign _in (а не на корневую страницу), и ничего не загружается (страница полностью белая, хотя источник не пуст). Есть ли что-то неправильно с моим классом CustomFailure или, может быть, оно находится в неправильной папке?
Я использую Rails 3.0.1 и Devise 1.1.rc0.
Вики, где этот код найден, находится по адресу: Как: Перенаправить на определенную страницу, когда пользователь не может быть аутентифицирован
Ответы
Ответ 1
Попробуйте поместить custom_failure.rb
в папку lib
, поскольку она не является помощником. Затем убедитесь, что файл загружен. Вероятно, вы попытаетесь автоматически загрузить все файлы в lib
.
РЕДАКТИРОВАТЬ. Чтобы создать автоматически загруженную библиотеку lib, вы должны вставить следующее в свой application.rb
:
config.autoload_paths += %W(#{config.root}/lib)
EDIT2: вы забыли позвонить redirect_to
при попытке перенаправления. На данный момент respond
возвращает только root_url
. Попробуйте следующее:
def respond
if http_auth?
http_auth
else
redirect_to root_url
end
end
fyi: разработчики-разработчики также выполняют это перед перенаправлением:
store_location!
flash[:alert] = i18n_message unless flash[:notice]