我有一个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提供的一种方法。
执行此操作的“路线”是什么?
答案 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
时,您可以获得重定向。