14

フォーム データを POST したい phoenix ルートがありますが、オプションのフォーム フィールドが約 4 つあります (フォームはエンド ユーザーによって作成されるため、これらのフィールドは POST ペイロードに存在しない場合があります)。

ルートの Phoenix コントローラーでは、これをどのように処理しますか?

例えば:

私のフォームは

Field1,
Field2
Field3 (optional)
Field4 (optional)
Field5 (optional)

また、フォームを POST する場合は、常に必要がありますField1Field2、他のフィールドの任意の組み合わせを使用できます。

したがって、これまでのコントローラーコードは次のようになります。

def create(conn, %{"field1" => field1, "field2" => field2) do
end

他の 3 つをオプションにするにはどうすればよいですか? それらをすべて追加すると、それらが必要になり、送信された可能性のあるフォームごとに関数を作成する必要はありません。

4

1 に答える 1

31

コントローラーが受け取るパラメーターは単なるマップなので、おそらくMap.get/3. この関数を使用すると、次の行で何かを実行できます。

def create(conn, %{"field1" => f1, "field2" => f2} = params) do
  f3 = Map.get(params, "field3", "my default value")
  # similar for the other fields
end

オプションのパラメーターのすべてのデフォルト値を含むマップを作成し、次を使用することもできますMap.merge/2

@optional_params %{"field3" => "default3", "field4" => "default4"}

def create(conn, %{"field1" => f1, "field2" => f2} = params) do
  # `params` has precedence over `@optional_params`, that's why we're using it
  # as the second argument here.
  params = Map.merge(@optional_params, params)
end
于 2015-06-07T13:08:11.490 に答える