Передача параметра Elixir в Plug для предыдущего параметра plug

Возможно, это не вопрос Breadcrumble, но как мне передать параметр из предыдущего плагина в крошку? Например, если предыдущий плагин 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

2 ответа

Решение

Вы можете позвонить add_breadcrumb подключите прямо от set_merchant подключи так:

assign(conn, :merchant, merchant)
|> Breadcrumble.Plugs.add_breadcrumb(name: "Dashboard", url: "/dashboard/#{merchant_id}")

Вы можете передать столько параметров, сколько захотите, как уже 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 функция
Другие вопросы по тегам