Elixir Phoenix全球变量插头

Pra*_*oya 10 elixir phoenix-framework

我试图基于其域获取网站的标识符,但在为其编写插件后,我遇到了一个问题,其中系统中的所有链接都返回根URL内容.

LIB/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
Run Code Online (Sandbox Code Playgroud)

在lib/myapp/endpoint.ex中

plug Myapp.Plug.RequestVar, Myapp.Router
plug Myapp.Router
Run Code Online (Sandbox Code Playgroud)

这个插头有什么问题吗?

编辑:根据响应修复"if"条件.

Gaz*_*ler 6

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
Run Code Online (Sandbox Code Playgroud)

您可以使用struct_url/0覆盖它:

struct_url = update_in(Endpoint.struct_url.host, fn (_) -> "domain2" end)
some_url(struct_url, :index)
Run Code Online (Sandbox Code Playgroud)

您还可以为第二个域定义第二个端点.如果您的链接是内部的,那么您应该考虑使用_path函数而不是_url函数.在_url当需要域助手通常使用(例如电子邮件).