14

我有一个凤凰路由,我想将一些表单数据发布到,但是表单的大约 4 个字段是可选的(表单由最终用户构造,因此这些字段可能不存在于 POST 有效负载中)

在路由的 Phoenix 控制器中,您将如何处理?

例如:

我的表格有

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

并且发布表单必须始终具有Field1并且Field2但可以具有其他字段的任意组合。

所以到目前为止我的控制器代码是这样的:

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 回答