web-dev-qa-db-ja.com

フェニックスのscrub_paramsはRails強力なパラメーターのようなものですか?

Phoenix scrub_paramsメソッドのドキュメントは私には少し不明確です。この機能はRails強力なパラメーター機能に似ているようです。ただし、このようなコントローラーで使用する場合は、

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

...ホワイトリストに登録するパラメータを明示的に指定していません。 scrub_paramsのコードを見てきましたが、Elixirについては十分に知識がないので、何が起こっているのかよくわかりません。

この方法は、モデルを調べて、パラメーターをホワイトリストに登録するために必須およびオプションのフィールドモジュール属性を使用するだけですか?

また、scrub_paramsのドキュメントには、「required_keyが存在するかどうかを確認する」と記載されています。 「必須鍵」とは何ですか?それはモデルの必須フィールドだけですか?

25
Elliot Larson

scrub_params/2 関数は実際にはRails強力なパラメーターとは異なります。Ectoでは、 Ecto.Changeset.cast)を使用してチェンジセット関数で許可されたキーを定義します。/4

スクラブパラメータは次のことを行います。

  • 必要なキーが存在することを確認してください。
  • 必要なキーを使用して、paramsのマップから空の値をnilに変更します

たとえば、次のように呼び出します。

plug scrub_params "user"

「ユーザー」キーの存在を確認します。から ドキュメント

Required_keyが存在しない場合、Phoenix.MissingParamErrorが発生します。

次のようなパラメータマップがある場合:

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

次に、「age」パラメータはnilに変換されます。これにより、パラメータを使用してチェンジセット関数を直接呼び出すことができます。

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

scrub_params/2はモデルとはまったく関係がなく、Ecto.Changeset.cast/4関数は必須フィールドのセットとオプションフィールドのセットを受け取るため、Ectoでうまく機能します。 nilを必須フィールドに渡すと、変更セットが無効になり、フィールドにエラーが追加されます。

40
Gazler