具有强参数白名单的控制器的基本原理

Rationale for the controller having the strong params whitelist

在我见过的大多数 Rails 应用程序中,控制器会列出提交属性时允许或不允许的属性。

class PersonsController < ApplicationController
  # rest of code
  def person_params
    params.require(:person).permit(:name)
  end
end

我们没有看到类似的东西

# Hypothetical code only
class Person < ActiveRecord::Base
  def my_param_whitelist
    [:name]
  end
end

尽管在模型中加入白名单似乎更干class。

控制器有白名单而不是正在修改的模型的理由是什么?

我没有从技术上考虑太多,但这是一个直觉的答案。

如果您在模型中声明允许的参数,是的,这样可以使代码保持干燥,您不必在每个控制器中重复自己,但这意味着必须与模型通信的每一段代码都必须通过相同的白名单。

但是,如果您在控制器中保留允许的参数,则可以允许不同的控制器拥有自己的白名单。

例如,用户 (UserController) 可能无法更改 his/her 已注册 username/email,但管理员 (AdminController) 可能能够这样做。在这种情况下,UserController 和 AdminController 有自己的允许参数白名单。