У меня есть приложение rails, которое использует Clearance для регистрации и входа в систему.После регистрации пользователь перенаправляется на accounts/new
для завершения настройки своей учетной записи.Учетная запись belongs_to
Пользователь и пользовательская has_one
учетная запись.(Модели Account и User являются отдельными, потому что есть атрибуты, такие как «Название компании», которые я не хочу вставлять в модель User.)
Я бы хотел заблокировать все в приложениии перенаправить их на accounts/new
, если они попытаются получить доступ к чему-либо, кроме маркетинговых страниц, страниц регистрации и страниц входа, прежде чем они создадут Учетную запись.
Я думаю, что добавление before_action
к ApplicationController - это правильный подход, а затем использование :skip_before_action
на любом controller#action
, к которому им необходим доступ перед созданием учетной записи (например, / signup или / login).или маркетинговые страницы).
Это кажется правильным подходом, так как все приложение будет заблокировано по умолчанию, если пользователь не создал учетную запись.Явно используя :skip_before_action
по мере необходимости, кажется, что меньше шансов создать дыры в приложении по ошибке.
Но я не могу заставить before_action
на ApplicationController работать, потому что япродолжаю получать эту ошибку, когда я захожу на страницу типа / регистрация:
NoMethodError in Clearance::UsersController#new
undefined method `account' for nil:NilClass
Я пытаюсь сделать что-то вроде этого:
class ApplicationController < ActionController::Base
include Clearance::Controller
before_action :require_login
before_action :require_account
private
def require_account
if current_user.account != nil
redirect_to dashboard_path
end
end
end
Этот синтаксис работал, когда я был внутри моего AccountsControllerи просто перенаправил мое accounts#new
действие, но теперь у меня возникли проблемы с выяснением, как получить такое же поведение во всем приложении.Примечание: current_user
- это метод, предоставляемый Clearance.
Что такое «путь Rails» для этого?