Phoenix的scrub_params是否像Rails一样强大的参数?

时间:2015-11-28 18:59:59

标签: ruby-on-rails elixir phoenix-framework ecto

Phoenix scrub_params方法的文档对我来说有点不清楚。看起来这个功能类似于Rails强参数功能。但是,当你在像这样的控制器中使用它时,

plug :scrub_params, "user" when action in [:create]

...您没有明确说明要将哪些参数列入白名单。我已经查看了scrub_params的代码了,但是我对Elixir的绰绰有余,我不太确定发生了什么。

这种方法只是查看模型并使用必需和可选的字段模块属性来列入白名单参数吗?

此外,scrub_params文档说“检查required_key是否存在”。什么是“必需的钥匙”?这只是模型中的必填字段吗?

1 个答案:

答案 0 :(得分:39)

scrub_params/2函数并不像Rails强参数。在Ecto中,您可以使用Ecto.Changeset.cast/4在变更集功能中定义允许的密钥。

Scrub参数执行以下操作:

  • 确保所需的密钥存在。
  • 使用所需的nil
  • 键,在地图中使用参数更改空值

例如,呼叫:

plug scrub_params "user"

将检查"用户"是否存在键。来自the docs

  

如果required_key不存在,则会引发Phoenix.MissingParamError。

如果你有一个看起来像的参数图:

%{"user" => %{"name" => "foo", "age" => ""}}

然后"年龄"参数将转换为nil。这允许您直接使用参数调用变更集函数:

def create(conn, %{"user" => user_params}) do
  User.changeset(user_params)
end

scrub_params/2与您的模型完全无关,它只适用于Ecto,因为Ecto.Changeset.cast/4函数需要一组必填字段和一组可选字段。将nil传递到必填字段会使变更集失效,并为该字段添加错误。