如何在Rails中共享多个路由的条件重定向逻辑



我在Rails 6应用程序中使用Devise进行身份验证。一旦用户登录,我希望在允许他们访问任何和所有经过身份验证的路线之前,有条件地检查他们是否已完成登录。如果他们没有,那么他们应该通过入职流程重新定向。类似这样的东西:

unless current_user.has_completed_onboarding
redirect_to '/onboarding'
end

我有大约十几条路线想要实现这个逻辑。在每个请求之前将此检查添加到经过身份验证的路由而不在每个控制器中复制它的最佳方法是什么?谢谢

在这种情况下,您可以在ApplicationController中编写一个方法。假设check_user_onboarding

def check_user_onboarding
return redirect_to '/onboarding' unless current_user.has_completed_onboarding
end

然后在控制器中,您可以通过添加before_action回调进行检查。下面的一个将检查该控制器的所有方法。

before_action :check_user_onboarding

您还可以指定需要检查的方法,如-

before_action :check_user_onboarding, only: [:method1, :method2]

或者还有except

before_action :check_user_onboarding, except: [:method1, :method2]

最新更新