Как заблокировать все приложение Rails, пока пользователь не завершит настройку своей учетной записи - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть приложение 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» для этого?

1 Ответ

1 голос
/ 03 апреля 2019

Если я правильно понял, я считаю, что вы правильно делаете это "Ruby on Rails way"!

Ошибка NoMethodError вызвана тем, что внутри некоторых контекстов вашего приложения вы нет метода current_user.

Если вы хотите перенаправить пользователя на dashboard_path, когда у current_user уже есть учетная запись , вам следует попробоватьследующее:

class ApplicationController < ActionController::Base
  include Clearance::Controller
  before_action :require_login
  before_action :require_account

  private

  def require_account
    if current_user && current_user.account.present?
      redirect_to dashboard_path
    end
  end
end

Таким образом, вы можете получить перенаправление, когда current_user is present AND current_user have one account, без skip_before_action.

...