我想匹配两种参数集。
如果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
答案 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_id
和sub_id
进行模式匹配的原因是,正如您所说,sub_id
只会出现在控制器操作是来自同一索引路径的get请求。