【问题标题】:Is Phoenix's scrub_params like Rails strong parameters?Phoenix 的scrub_params 是不是像Rails 的强参数?
【发布时间】:2016-01-29 07:11:49
【问题描述】:

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

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

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

此方法是否只是查看模型并使用必填和可选字段模块属性来将参数列入白名单?

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

【问题讨论】:

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


    【解决方案1】:

    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 传递给必填字段将使变更集无效并为该字段添加错误。

    【讨论】:

    • 感谢您的澄清。这是有道理的。
    • 那么,Phoenix 中的强参数相当于什么?我需要限制用户输入。感谢to my question here.的回答。
    猜你喜欢
    • 2017-02-17
    • 2021-12-09
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多