在用户完成帐户设置之前,如何锁定整个Rails应用程序

时间:2019-04-03 16:45:49

标签: ruby-on-rails ruby model-view-controller actioncontroller clearance

我有一个Rails应用,该应用使用Clearance进行注册和登录。注册后,用户将被重定向到accounts/new以完成其帐户设置。帐户belongs_to用户和用户has_one帐户。 (帐户和用户模型是分开的,因为有一些属性,例如“公司名称”,我不想在用户模型中输入。)

我想锁定应用程序中的所有内容,并将它们重定向到accounts/new,如果他们在创建帐户之前尝试访问除营销页面,注册和登录页面以外的任何内容。

我认为将before_action添加到ApplicationController是正确的方法,然后在创建帐户(例如/ signup)之前,在他们需要访问的任何:skip_before_action上使用controller#action或/ login或Marketing页面)。

这似乎是正确的方法,因为默认情况下,如果用户尚未创建帐户,则整个应用程序将被锁定。通过根据需要显式使用:skip_before_action,似乎不太可能错误地在应用程序中造成漏洞。

但是我无法在ApplicationController上使before_action正常工作,因为当我访问/ signup之类的页面时,我总是收到此错误:

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提供的一种方法。

执行此操作的“路线”是什么?

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,我认为您是采用“ Ruby on Rails方式”的正确方法!

发生错误NoMethodError的原因是,在应用程序的某些上下文中,您没有 current_user方法。

如果您要在current_user已经拥有该帐户时将用户重定向到dashboard_path ,则应尝试以下操作:

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时,您可以获得重定向。