我有一个使用许可进行注册和登录的rails应用程序。注册后,用户将被重定向到accounts/new
以完成其帐户设置。帐户belongs_to
用户和用户has_one
帐户。(帐户和用户模型是分开的,因为有些属性(如"公司名称")我不想放入用户模型中。
我想锁定应用程序中的所有内容,如果他们在创建帐户之前尝试访问营销页面、注册和登录页面以外的任何内容,accounts/new
将他们重定向到。
我认为向应用程序控制器添加before_action
是正确的方法,然后在创建帐户之前在他们需要访问的任何controller#action
上使用:skip_before_action
(例如/signup或/login或营销页面)。
这似乎是正确的方法,因为如果用户尚未创建帐户,则默认情况下整个应用程序将被锁定。通过根据需要显式使用:skip_before_action
,似乎错误地在应用程序中创建漏洞的可能性较小。
但是我无法使应用程序控制器上的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 提供的方法。
这样做的"Rails方式"是什么?
如果我理解正确,我认为你以"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
和current_user have one account
时获得重定向,无需skip_before_action
。