ruby-on-rails - 在 Rails Controller 中编写条件过滤器的正确方法

标签 ruby-on-rails

要在 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/

相关文章:

ruby-on-rails - 为什么我不能取消对非管理员用户的 Rack-mini-profiler 授权

ruby-on-rails - 如何确定rails应用程序所需的cpu、ram?

ruby-on-rails - 使用 CarrierWave、Rails 3 上传种子文件

ruby-on-rails - 用户上传的背景?

ruby-on-rails - 回形针 :style options not working with s3_direct_upload

mysql - 从 rails 迁移创建 mysql 函数

ruby-on-rails - rails 模型 has_many :through associations

javascript - 如何链接这两个对象(图像映射形状和复选框)?

c# - Rails ActionController 类中的 around_filter 等价于 C# 的东西是什么?

ruby-on-rails - 对我的位置进行地理编码并使用 google-maps-for-rails gem 显示