如何在用户完成帐户设置之前锁定整个 Rails 应用程序
How to lock down an entire Rails app until a User completes their account set up
我有一个 rails 应用程序,它使用 Clearance 进行注册和登录。注册后,用户将被重定向到 accounts/new
以完成他们的帐户设置。帐户 belongs_to
用户和用户 has_one
帐户。 (Account 和 User 模型是分开的,因为有属性,例如 "Company Name" 我不想放入 User 模型。)
如果他们在创建帐户之前尝试访问营销页面、注册和登录页面以外的任何内容,我想锁定应用程序中的所有内容并将它们重定向到 accounts/new
。
我认为向 ApplicationController 添加 before_action
是正确的方法,然后在创建帐户之前对他们需要访问的任何 controller#action
使用 :skip_before_action
(例如/signup 或 /login 或营销页面)。
这似乎是正确的方法,因为如果用户尚未创建帐户,整个应用程序将默认锁定。通过根据需要显式使用 using :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提供的一种方法。
这样做的 "Rails way" 是什么?
如果我理解正确,我认为你在 'Ruby on Rails way' 中的做法是正确的!
错误 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
。
我有一个 rails 应用程序,它使用 Clearance 进行注册和登录。注册后,用户将被重定向到 accounts/new
以完成他们的帐户设置。帐户 belongs_to
用户和用户 has_one
帐户。 (Account 和 User 模型是分开的,因为有属性,例如 "Company Name" 我不想放入 User 模型。)
如果他们在创建帐户之前尝试访问营销页面、注册和登录页面以外的任何内容,我想锁定应用程序中的所有内容并将它们重定向到 accounts/new
。
我认为向 ApplicationController 添加 before_action
是正确的方法,然后在创建帐户之前对他们需要访问的任何 controller#action
使用 :skip_before_action
(例如/signup 或 /login 或营销页面)。
这似乎是正确的方法,因为如果用户尚未创建帐户,整个应用程序将默认锁定。通过根据需要显式使用 using :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提供的一种方法。
这样做的 "Rails way" 是什么?
如果我理解正确,我认为你在 'Ruby on Rails way' 中的做法是正确的!
错误 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
。