Elixir 将先前插件参数的参数传递给插件
Elixir Pass parameter into Plug for previous plug parameter
这可能不是面包屑问题,但如何将先前插件的参数传递到面包屑?例如,如果之前的插件 set_merchant
将商家设置为 conn.params.merchant
,我如何将那个 id
传递给 breadcrumable?
plug :set_merchant
plug :add_breadcrumb, name: "Dashboard", url: "/dashboard/#{conn.params.merchant_id}"
.....
defp set_merchant(conn, _opt) do
case conn.params do
%{"merchant_id" => merchant_id} ->
case MyApp.find_merchant(merchant_id) do
nil ->
conn |> redirect(to: "/dashboard/#{merchant_id}") |> halt
merchant ->
assign(conn, :merchant, merchant)
end
_ ->
conn |> redirect(to: "/") |> halt
end
end
conn.params.merchant_id
是我想从第一个插件 set_merchant
传递参数的地方
您可以像使用 Plug.Conn.assign/3
函数一样传递任意数量的参数。
最简单的解决方案是在 case
:
中执行类似的操作
case MyApp.find_merchant(merchant_id) do
nil ->
conn
|> redirect(to: "/dashboard/#{merchant_id}")
|> halt()
merchant ->
conn
|> assign(:merchant, merchant)
|> assign(:merchant_id, merchant_id) # this is what you asked for
end
那么您将不会通过添加此 url
和 merchant_id
来调用您的 plug
,因为 conn 已经拥有它,因为 set_merchant
会提供给您。
此外,另一种选择:
如果您不希望 merchant_id
存在,您只需从 merchant
获取它,方法是:
merchant_id = conn.assigns.merchant.id
你必须区分 params
和 assigns
。我不确定您是如何获得 merchant
,但请快速记住这一点:
params
来自外部,例如POST 请求、查询字符串等
assigns
由您或任何其他使用 assign/3
函数 修改 Plug.Conn
的人设置
您可以像这样直接从 set_merchant
插件调用 add_breadcrumb
plug:
assign(conn, :merchant, merchant)
|> Breadcrumble.Plugs.add_breadcrumb(name: "Dashboard", url: "/dashboard/#{merchant_id}")
这可能不是面包屑问题,但如何将先前插件的参数传递到面包屑?例如,如果之前的插件 set_merchant
将商家设置为 conn.params.merchant
,我如何将那个 id
传递给 breadcrumable?
plug :set_merchant
plug :add_breadcrumb, name: "Dashboard", url: "/dashboard/#{conn.params.merchant_id}"
.....
defp set_merchant(conn, _opt) do
case conn.params do
%{"merchant_id" => merchant_id} ->
case MyApp.find_merchant(merchant_id) do
nil ->
conn |> redirect(to: "/dashboard/#{merchant_id}") |> halt
merchant ->
assign(conn, :merchant, merchant)
end
_ ->
conn |> redirect(to: "/") |> halt
end
end
conn.params.merchant_id
是我想从第一个插件 set_merchant
您可以像使用 Plug.Conn.assign/3
函数一样传递任意数量的参数。
最简单的解决方案是在 case
:
case MyApp.find_merchant(merchant_id) do
nil ->
conn
|> redirect(to: "/dashboard/#{merchant_id}")
|> halt()
merchant ->
conn
|> assign(:merchant, merchant)
|> assign(:merchant_id, merchant_id) # this is what you asked for
end
那么您将不会通过添加此 url
和 merchant_id
来调用您的 plug
,因为 conn 已经拥有它,因为 set_merchant
会提供给您。
此外,另一种选择:
如果您不希望 merchant_id
存在,您只需从 merchant
获取它,方法是:
merchant_id = conn.assigns.merchant.id
你必须区分 params
和 assigns
。我不确定您是如何获得 merchant
,但请快速记住这一点:
params
来自外部,例如POST 请求、查询字符串等assigns
由您或任何其他使用assign/3
函数 修改
Plug.Conn
的人设置
您可以像这样直接从 set_merchant
插件调用 add_breadcrumb
plug:
assign(conn, :merchant, merchant)
|> Breadcrumble.Plugs.add_breadcrumb(name: "Dashboard", url: "/dashboard/#{merchant_id}")