Как вы общаетесь с агентом Elixir из контроллера Phoenix? - PullRequest
0 голосов
/ 04 мая 2018

Здорово изучать язык достаточно рано в его жизни, когда создатель языка отвечает на ваши вопросы! Ну, мой вопрос - как вы общаетесь с агентом из метода контроллера Phoenix? Я получил это в hello_blockchain / monitor.ex:

defmodule HelloBlockchain.Monitor do
  def start_link do
    Agent.start_link(fn -> %{} end)
  end

  def put(pid, key, value) do
    Agent.update(pid, &Map.put(&1, key, value))
  end

  def get(pid, key) do
    Agent.get(pid, &Map.get(&1, key))
  end
end

и в моем hello_blockchain_web / controllers / block_controller.ex я хочу сохранить значение в действии контроллера (список) и извлечь его в том же действии при следующем вызове. Но мне нужен пид Агента, чтобы сделать это. Кажется, мне тоже нужно это сохранить. Или я мог бы использовать именованного агента. Но мне нужен способ сохранить это имя. Похоже на Catch-22. Что мне не хватает?

1 Ответ

0 голосов
/ 04 мая 2018

Agent Страница документации начинается с примера, который вы можете использовать как есть. В основном: в Elixir вы хотите использовать с именем GenServer s, чтобы искать их по name, а не по pid.

Этот подход имеет много преимуществ, например, name не изменяется при перезапуске сервера, а pid -.

Итак, вы делаете следующее:

defmodule HelloBlockchain.Monitor do
  use Agent

  def start_link do
    # __MODULE__ here would be HelloBlockchain.Monitor
    Agent.start_link(fn -> %{} end, name: __MODULE__)
  end

  def put(key, value) do
    Agent.update(__MODULE__, &Map.put(&1, key, value))
  end

  def get(key) do
    Agent.get(__MODULE__, &Map.get(&1, key))
  end
end

И все готово; Agent.get(HelloBlockchain.Monitor, :foo) будет работать откуда угодно (при условии, что Agent действительно запущен и контролируется).

Очевидно, вам не нужно сохранять имя, вы просто даете имя, которое предопределено и известно. Общий подход в Elixir заключается в использовании имени модуля, в который вложен этот агент.

...