具有强参数白名单的控制器的基本原理
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 有自己的允许参数白名单。
在我见过的大多数 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 有自己的允许参数白名单。