问题描述
假设我对控制器有一个顾虑,它的名字是身份验证。它包含一个before_action 方法authenticate_user。我应该在哪里写 before_action :authenticate_user? 最佳做法是什么?它应该写在关注中还是包含在这个关注中的控制器中?
注意:我想实现单一职责
解决方法
这取决于您的控制器结构。身份验证逻辑最常放置在大多数其他控制器最终继承的更高级别的控制器中,而不是一个关注点。这是因为您可以简单地在更高级别启用身份验证并使其在所有子控制器上处于活动状态,而无需为每个子控制器显式添加关注点,这可能更容易出错。该更高级别的控制器将包含 before_action
和 authenticate_user
方法。如果出于任何原因,沿途有一个控制器需要禁用身份验证,假设这是一个例外,您可以使用 skip_before_action
。
class UserController < ApplicationController
before_action :authenticate
private
def authenticate
# ...
end
end
class SomeController < UserController
# auth already enabled here
end