Перенаправление проблем, когда пользователь не может войти с помощью Devise - PullRequest
15 голосов
/ 15 ноября 2010

В моем приложении я аутентифицирую пользователей, используя Devise, и заметил, что вы можете изменить страницу, на которую вы перенаправляетесь, в случае неудачного входа.В вики я нашел следующий пример:

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 (как должны быть сделаны состояния вики):

config.warden do |manager|
  manager.failure_app = CustomFailure
end

Несмотря на то, что я не получаю ошибок, при неправильном входе он по-прежнему перенаправляет на страницу / users / sign_in (не на корневую) и ничего не загружается (страница полностью белая, хотя источник не пустой).Что-то не так с моим классом CustomFailure или, может быть, он находится не в той папке?

Я использую Rails 3.0.1 и Devise 1.1.rc0.

Вики, где найден этот код,at: How To: Перенаправление на определенную страницу, когда пользователь не может быть аутентифицирован

1 Ответ

19 голосов
/ 15 ноября 2010

Попробуйте поместить custom_failure.rb в вашу папку lib, поскольку она не является вспомогательной.Затем убедитесь, что файл загружен.Возможно, вы попытаетесь загрузить все файлы в lib автоматически.

РЕДАКТИРОВАТЬ : чтобы получить автоматически загружаемую библиотеку, вы должны вставить в application.rb следующее:*

EDIT2 : вы забыли позвонить redirect_to при попытке перенаправления.На данный момент respond возвращает только root_url.Попробуйте это:

def respond
  if http_auth?
    http_auth
  else
    redirect_to root_url
  end
end

к сведению: разработчики также выполняют это перед перенаправлением:

store_location!
flash[:alert] = i18n_message unless flash[:notice]
...