Эликсир Феникс глобальный переменный штекер
Я пытаюсь получить идентификатор веб-сайта на основе его домена, но после написания плагина для него я столкнулся с проблемой, когда все ссылки в системе возвращают корневой 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.