Перенаправление проблем, когда пользователь не может войти в систему с помощью приложения

В моем приложении я аутентифицирую пользователей с помощью 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]