перенаправление на страницу регистрации, если пользователь не вошел в систему в devise

#ruby-on-rails #devise

#ruby-on-rails #разработка

Вопрос:

Из чтения кода devise и wiki кажется, что нет возможности перенаправить пользователя на страницу регистрации, если пользователь не вошел в систему. В lib/devise/failure_app.rb, похоже, что URL перенаправления жестко закодирован.

   def redirect_url
    opts  = {}
    route = :"new_#{scope}_session_path"
    opts[:format] = request_format unless skip_format?

    if respond_to?(route)
      send(route, opts)
    else
      root_path(opts)
    end
  end
  

Я хочу спросить, что это лучшая практика для выполнения работы. Я подумываю о том, чтобы вручную установить значение user_return_to session, а затем вызвать страницу регистрации. Это хорошая практика?

Ответ №1:

Я думаю, что наилучшей практикой в этой ситуации является следование этой вики-странице devise: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

Комментарии:

1. Я не понимаю эту страницу wiki, можете ли вы немного объяснить, я новичок в rails, я хочу показать страницу входа, если пользователь не вошел в систему

2. В связанной статье есть другая (лучшая) ссылка, на которую она ссылается, смотрите Здесь: github.com/plataformatec/devise/wiki /…

Ответ №2:

В последней версии Devise рекомендуется следовать этим инструкциям:

https://github.com/heartcombo/devise/wiki/Redirect-to-new-registration-(sign-up)-path-if-unauthenticated

Для этого определите пользовательское приложение с ошибкой с помощью метода route, который возвращает символ, представляющий именованный маршрут для перенаправления:

 # app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
  def route(scope)
    :new_user_registration_url
  end
end
  

Затем внутри инициализатора Devise укажите ваше приложение с ошибкой:

 # config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = MyFailureApp
end
  

Загрузите каталог lib

 config.autoload_paths << Rails.root.join('lib')