0

这可能不是 Breadcrumbable 问题,但是如何将先前插件中的参数传递到面包屑中?例如,如果之前的插件set_merchant将商家设置为conn.params.merchant,我如何将其传递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是我想从第一个插件传递参数的地方set_merchant

4

2 回答 2

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通过添加这个来调用你urlmerchant_id,因为 conn 已经拥有它,因为它set_merchant会提供给你。

另外,另一种选择:

如果你不想在merchant_id那里,你可以简单地从 获取它,方法merchant是:

merchant_id = conn.assigns.merchant.id

你必须params区别于assigns. 我不知道你是怎么得到的merchant,但要快速记住这一点:

  • params来自外部,例如 POST 请求、查询字符串等。
  • assigns由您或Plug.Conn使用assign/3功能修改的任何其他人设置
于 2018-01-02T16:48:21.380 回答
1

您可以像这样直接从插件调用add_breadcrumb插件set_merchant

assign(conn, :merchant, merchant)
|> Breadcrumble.Plugs.add_breadcrumb(name: "Dashboard", url: "/dashboard/#{merchant_id}")
于 2018-01-02T17:18:48.540 回答