要在 Rails 的 Controller 中编写条件过滤器,推荐的方法似乎是使用如下所示的 lambda:
before_action :authenticate_user, unless: -> { !Rails.env.production? && ENV['DISABLE_LOGIN'] == 'true' }
虽然上述似乎是正确的方法,但在我的示例中,以下情况似乎也适用:
before_action :authenticate_user unless !Rails.env.production? && ENV['DISABLE_LOGIN'] == 'true'
我想了解的是这两种方法之间有什么区别,以及第二种方法在某些情况下是否会产生不良结果。
最佳答案
让我首先添加一些括号和一些换行符,以更好地显示两者之间的差异。
before_action(
:authenticate_user,
unless: -> { !Rails.env.production? && ENV['DISABLE_LOGIN'] == 'true' }
)
# vs
unless !Rails.env.production? && ENV['DISABLE_LOGIN'] == 'true'
before_action(:authenticate_user)
end
第一个版本将 unless
作为选项的一部分,始终定义 before_action :authenticate_user
。除非 lambda 为每个请求执行,并且仅当 lambda 解析为假值时才调用 authenticate_user
。
第二个版本使得检查 Controller 被定义。根据这些检查,before_action :authenticated
要么已定义,要么未定义。请注意,此版本中进行的检查不能使用 params
,因为它使用 Controller 类上下文,只有 Controller 类的实例才能访问 Web 请求。
由于您的条件仅使用环境变量并且不使用任何网络请求数据,因此第二个选项更快。但是,如果您在服务器运行时更改环境变量,则需要重新加载 Controller 类(通过重新启动服务器)。
如果您使用第一个选项,您可以更改环境变量,并让它们影响 Controller 而无需重新启动。由于对每个请求进行检查。
关于ruby-on-rails - 在 Rails Controller 中编写条件过滤器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66211057/