Эликсир Феникс глобальный переменный штекер

Я пытаюсь получить идентификатор веб-сайта на основе его домена, но после написания плагина для него я столкнулся с проблемой, когда все ссылки в системе возвращают корневой URL-адрес.

Библиотека/MyApp/вилки/request_var.ex

defmodule Myapp.Plug.RequestVar do
  import Plug.Conn

  @doc false
  def init(default), do: default

  @doc false
  def call(conn, router) do
    host = conn.host
    if host == "ll.com" || host == "domain1.com" do
      slug = "domain1"
    else
      slug = "domain2"
    end

    conn |> put_private(:site_slug, slug)
  end
end

В lib/myapp/endpoint.ex

plug Myapp.Plug.RequestVar, Myapp.Router
plug Myapp.Router

Что-то не так с этим подключением?

Изменить: Исправлено условие "if" на основе ответов.

Ответ 1

url генерируется из endpoint.url, а не host для Plug.Conn

Из https://github.com/phoenixframework/phoenix/blob/8fe0538fd7be2adb05e2362b02fa8bd6bf3c6c46/lib/phoenix/router/helpers.ex#L13:

  def url(_router, %Conn{private: private}) do
    private.phoenix_endpoint.url
  end

  def url(_router, %Socket{endpoint: endpoint}) do
    endpoint.url
  end

  def url(_router, %URI{} = uri) do
    uri_to_string(uri)
  end

  def url(_router, endpoint) when is_atom(endpoint) do
    endpoint.url
  end

Вы можете переопределить это, используя struct_url/0:

struct_url = update_in(Endpoint.struct_url.host, fn (_) -> "domain2" end)
some_url(struct_url, :index)

Вы также можете определить вторую конечную точку для своего второго домена. Если ваши ссылки являются внутренними, вам следует использовать функции _path вместо функций _url. Помощники _url обычно используются, когда домен необходим (например, электронные письма.)

Ответ 2

У вас есть ошибка в вашем предложении if. Он всегда будет true.

iex(1)> host = "l2.com"
"l2.com"
iex(2)> host == "ll.com" || "domain1.com"
"domain1.com"

Как для допустимых, так и для недопустимых доменов.

iex(3)> host = "ll.com"                  
"ll.com"
iex(4)> host == "ll.com" || "domain1.com"
true

Тест:

iex(6)> if host == "ll.com" || "domain1.com" do
...(6)>   IO.puts "if"
...(6)> end
if
:ok

Вы должны изменить свое предложение на if host == "ll.com" || host == "domain1.com" do. Но. Не так уж идиоматично использовать такие предложения. Обычно лучше использовать pattern-matching.