Вилки эликсира феникса и где их разместить - PullRequest
0 голосов
/ 05 ноября 2018

Сейчас я изучаю фреймворк Elixir Phoenix. Я застрял на https://hexdocs.pm/phoenix/routing.html#forward сейчас, это о том, как использовать команду forward.

Там написано, что сейчас нет необходимости изучать Plugs, поэтому, если я хочу попробовать эту команду forward, я могу просто скопировать их реализацию Plug в мое приложение . Но где именно? Я пытался найти это и пытался использовать то, что нашел, но я делаю что-то не так.

Это область из моего .\lib\hello_web\router.ex файла:

scope "/", HelloWeb do
  pipe_through :browser # Use the default browser stack

  get "/", PageController, :index
  forward "/jobs", BackgroundJob.Plug, name: "Hello, Phoenix"
end

И это код для Plug:

defmodule BackgroundJob.Plug do
  def init(opts), do: opts
  def call(conn, opts) do
    conn
    |> Plug.Conn.assign(:name, Keyword.get(opts, :name, "Background Job"))
    |> BackgroundJob.Router.call(opts)
  end
end

defmodule BackgroundJob.Router do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/", do: send_resp(conn, 200, "Welcome to #{conn.assigns.name}")
  get "/active", do: send_resp(conn, 200, "5 Active Jobs")
  get "/pending", do: send_resp(conn, 200, "3 Pending Jobs")
  match _, do: send_resp(conn, 404, "Not found")
end

Я должен был почти ничего не знать о Плагс и Фениксе на данный момент, так что это, вероятно, что-то очевидное, но я действительно застрял там на несколько часов. Может кто-нибудь помочь мне узнать, где разместить этот код?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Да, я понимаю ваше замешательство. Это можно объяснить немного более четко в руководствах.

Если вы передадите имя модуля в область действия, переданное имя модуля будет иметь префикс для всех модулей в области действия.

Так, например, предполагая, что переданное вами имя модуля равно HelloWeb, Когда вы передаете его в область, подобную этой:

scope "/", HelloWeb do
  ...
  get "/", PageController, :index
  forward "/jobs", BackgroundJob.Plug
end

маршрут "/" будет искать HelloWeb.PageController
маршрут "/jobs" будет искать HelloWeb.BackgroundJob.Plug

Итак, чтобы устранить вашу ошибку, я полагаю, что-то вроде этого:

helloweb.backgroundjob.plug.init/1 is undefined

Вы можете удалить переданное имя модуля из области действия и вручную добавить имена модулей, оставив BackgroundJob.Plug без изменений следующим образом:

scope "/",  do
  ...
  get "/", HelloWeb.PageController, :index
  forward "/jobs", BackgroundJob.Plug
end

Или, возможно, сохраните немного повторяющегося набора и добавьте вместо этого область «/ jobs», например:

  scope "/", HelloWeb do
    ...
    get "/", PageController, :index
  end

  scope "/jobs" do
    forward "/", BackgroundJob.Plug, name: "Hello Phoenix"
  end

Обратите внимание, что ... в примерах представляет pipe_through методы и другие маршруты, которые не были необходимы для передачи идеи.

Надеюсь, это поможет.

0 голосов
/ 06 ноября 2018

Добро пожаловать в stackoverflow.

Вы не опубликовали, какую ошибку вы получаете, но я полагаю, что ваша проблема в именовании модулей. В phoenix модули, используемые внутри блока scope, будут иметь префикс с именем модуля, которое вы задаете в качестве аргумента для этой области (в данном случае HelloWeb). Так что этого должно быть достаточно, чтобы изменить название вашего подключаемого модуля на HelloWeb.BackgroundJob.Plug. В качестве альтернативы вы не можете передать модуль определения объема на scope:

scope "/" do
  pipe_through :browser # Use the default browser stack

  get "/", HelloWeb.PageController, :index
  forward "/jobs", BackgroundJob.Plug, name: "Hello, Phoenix"
end

Обратите внимание на изменение PageController -> HelloWeb.PageController в этом случае.

С точки зрения того, где его поместить - подойдет любой файл .ex в lib, поскольку эликсир просто собирает их все. Фактически вы можете просто вставить код в router.ex, чтобы быстро его протестировать. По соглашению имя файла должно следовать за именем модуля, поэтому HelloWeb.BackgroundJob.Plug должно находиться в lib/hello_web/background_job/plug.ex.

...