如何在凤凰行动中对两种参数进行模式匹配

时间:2018-02-13 15:24:04

标签: elixir phoenix-framework

我想匹配两种参数集。 如果params来自IndexController,则只接收main_id。 但是,如果params来自同一页面index_path(@conn, :index, main_id)并选择框值。

IndexController.ex

defmodule IndexController do
  def index(conn, %{"main_id" => main_id, "sub_id" => sub_id}) do
    render(conn, "index.html")
  end
end

index.html.eex

<%= form_for @conn, index_path(@conn, :index, main_id), fn f -> %>
  <%= select f, :sub_id, Enum.map(@items, &{&1.item_name, &1.id}) %>
<% end %>

如何用两种参数集编写router.ex匹配?

get "/index/:main_id", IndexController, :index
post "/index/:main_id/:sub_id", IndexController, :index

1 个答案:

答案 0 :(得分:2)

您似乎需要处理可选参数,这就是我要这样做的方式:

defmodule IndexController do
  def index(conn, %{"main_id" => main_id} = params) do
    # retrieve sub_id from parameter with a nil fallback
    sub_id = params |> Map.get("sub_id", nil)
    render(conn, "index.html")
  end
end

此处我在"main_id"密钥上进行模式匹配,然后从sub_id变量中检索params

您不希望在参数参数中对main_idsub_id进行模式匹配的原因是,正如您所说,sub_id只会出现在控制器操作是来自同一索引路径的get请求。