Phoenix的scrub_params是否像Rails一样强大的参数?
Phoenix scrub_params
方法的文档对我来说有点不清楚。 看起来这个function类似于Rails强参数function。 但是,当你在像这样的控制器中使用它时,
plug :scrub_params, "user" when action in [:create]
…您没有明确说明要将哪些参数列入白名单。 我已经查看了scrub_params
的代码,但是我对Elixir的说法还不够,我不太清楚发生了什么。
此方法只是查看模型并使用必需和可选的字段模块属性来列入白名单参数吗?
此外, scrub_params
文档说“检查required_key是否存在”。 什么是“必需的钥匙”? 这只是模型中的必填字段吗?
scrub_params / 2函数并不像Rails强参数。 在Ecto中,您可以使用Ecto.Changeset.cast / 4在变更集函数中定义允许的密钥。
Scrub参数执行以下操作:
- 确保存在所需的密钥。
- 使用所需的键将参数中的空值更改为
nil
例如,调用:
plug scrub_params "user"
将检查是否存在“用户”密钥。 来自文档 :
如果required_key不存在,则会引发Phoenix.MissingParamError。
如果你有一个params地图,它看起来像:
%{"user" => %{"name" => "foo", "age" => ""}}
然后“age”参数将转换为nil
。 这允许您直接使用参数调用您的变更集function:
def create(conn, %{"user" => user_params}) do User.changeset(user_params) end
scrub_params/2
与您的模型完全无关,它只适用于Ecto,因为Ecto.Changeset.cast/4
函数采用一组必需字段和一组可选字段。 将nil
传递给必填字段将使变更集无效并为字段添加错误。