Elixir Pass参数插入Plug用于以前的插件参数

时间:2018-01-02 16:43:34

标签: elixir plug

这可能不是一个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传递参数的地方

2 个答案:

答案 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

您必须将paramsassigns区分开来。我不确定你如何得到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}")