这个问题是笼统的,但是我想问一个我想解决的具体情况。
我正在使用一个非常难闻的电子商务应用程序的代码库,我想对其进行重构。我以为我应该从用户身份验证开始。
在执行任何控制器操作之前,我们将检查用户是否具有特定类型:Guest
,Signed-In
或Admin
,以及是否允许用户访问此操作根据类型。如果满足所有条件,则执行该动作。这在大多数控制器中的大多数动作中都会发生。
我知道这段代码很臭,因为检查用户是否属于特定类型,并且(他)有权访问某个动作不是该动作的责任。
我们可以制作一个SessionsController
(或其他名称),然后让它处理身份验证和授权部分。但是我希望SessionsController
在每次请求之前自动完成其工作。 即每个请求都应通过SessionsController
,然后此控制器将决定是否将请求转发到适当的控制器。
我在Google上搜索了此内容,但未找到任何内容。因此,我的逻辑结论是不可能通过一系列控制器传递请求。但是我不确定。因此,如果有可能,请指导我如何进行。如果无法实现,那么建议采取其他任何方式。
答案 0 :(得分:1)
这听起来像是一个完美的示例,其中可以使用一个或多个before_action
。您可以在before_action
中放置ApplicationController
:
# in app/controllers/application_controller.rb
private
def authorize_admin
render status: 401 unless current_user? && current_user.admin?
end
然后,您可以在执行任何操作之前在要在其中运行此方法的任何控制器中声明。
# in any controller - even the ApplicationController
before_action :authenticate
您可以将before_action
配置为仅在特定条件或特定操作下运行。只需看看如何使用Filters in the Rails Guides。