【问题标题】:Optional POST parameters in Elixir PhoenixElixir Phoenix 中的可选 POST 参数
【发布时间】:2015-08-22 00:16:49
【问题描述】:

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

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

例如:

我的表格有

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

并且 POST 表单必须始终包含 Field1Field2,但可以包含其他字段的任意组合。

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

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

如何使其他 3 个可选?如果我将它们全部添加,那么它们将是必需的,我不想为每个潜在的提交表单创建一个函数,因为这似乎有点过分了。

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    控制器接收到的参数只是一张地图,所以您可能正在寻找类似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
    

    【讨论】:

    • 非常感谢,现在你已经发布了它很明显:)
    • 它工作正常。但三年过去了,有什么更新,新的方法吗?
    • @W.M.你的意思是?这仍然是一种非常可靠和简洁的方法:)。
    • @whatyouhide,是的,这是一种简洁的方法:) 我知道 Elixir 中的 `\` 运算符,认为它可以应用于函数定义行,尝试过但没有工作。
    • @W.M. `\\` 运算符用于默认 参数,而不是任何值。 Tbh 我认为这仍然是默认参数的最佳解决方案之一。您可以根据您希望如何放置默认值以及它们是动态还是静态等等变得更复杂,但对于这个问题,我认为这仍然是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2018-05-22
    • 2017-02-05
    • 2018-04-21
    相关资源
    最近更新 更多