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

那么您将不会通过添加此 urlmerchant_id 来调用您的 plug,因为 conn 已经拥有它,因为 set_merchant 会提供给您。

此外,另一种选择:

如果您不希望 merchant_id 存在,您只需从 merchant 获取它,方法是:

merchant_id = conn.assigns.merchant.id

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