Передача параметра 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
функция