这可能不是一个Breadcrumble问题,但如何将前一个插件中的参数传递给breadcrumbable?例如,如果之前的插件<serviceProvider>
<name>BusService</name>
<protocol>https</protocol>
<insecure>true</insecure>
<host>localhost</host>
<port>8443</port>
<path>/</path>
<pactBrokerUrl>http://localhost:8113/</pactBrokerUrl>
</serviceProvider>
在set_merchant
上设置商家,我该如何将conn.params.merchant
传递给breadcrumable?
id
.....
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
传递参数的地方
答案 0 :(得分:2)
您可以使用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
然后,您不会通过plug
添加此url
来致电merchant_id
,因为conn已经拥有它,因为set_merchant
会将其提供给您。
另外,另一个选择:
如果你不想在那里merchant_id
,你可以通过以下方式从merchant
获取它:
merchant_id = conn.assigns.merchant.id
您必须将params
与assigns
区分开来。我不确定你如何得到merchant
,但要快速记住:
params
来自外部,例如POST请求,查询字符串等。assigns
由您或使用Plug.Conn
功能assign/3
的任何其他人设置
答案 1 :(得分:1)
您可以直接从set_merchant
插件中调用add_breadcrumb
plug,如下所示:
assign(conn, :merchant, merchant)
|> Breadcrumble.Plugs.add_breadcrumb(name: "Dashboard", url: "/dashboard/#{merchant_id}")