Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir Phoenix全局变量插头_Elixir_Phoenix Framework - Fatal编程技术网

Elixir Phoenix全局变量插头

Elixir Phoenix全局变量插头,elixir,phoenix-framework,Elixir,Phoenix Framework,我试图根据网站的域获取其标识符,但在为其编写了一个插件之后,我遇到了一个问题,系统中的所有链接都返回根url内容 lib/myapp/plugs/request\u 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.h

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

lib/myapp/plugs/request\u 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”条件。

您的
if
子句中有一个错误。它将始终是
真的

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

如果host==“ll.com”| | host==“domain1.com”do,则必须将子句更改为
。但是使用这种从句是不习惯的。通常最好使用。

url
是从
端点.url
生成的,而不是
Plug.Conn的
主机

发件人:

您可以使用以下命令覆盖此选项:


您还可以为第二个域定义第二个端点。如果你的链接是内部的,那么你应该考虑使用<代码>路径> <代码>函数,而不是<>代码> URL< /Cuff>函数。
\u url
帮助程序通常在需要域(如电子邮件)时使用。

谢谢!我修复了if条件,但这并没有解决问题:(.谢谢Gazler。你能告诉我应该把这个结构url重写代码放在哪里,这样它才能在全球范围内有效吗?对不起,我对Phoenix很陌生。@PratikKhadloya首先,你肯定需要使用
\url
格式而不是
\u路径
格式吗?如果你这样做了,你能告诉我你从哪里调用这个吗?一个我的链接中有一个是登录链接,我不知道如何使用_url。
。当我单击此链接时,它会再次返回主页的整个html,给人一种页面中没有发生任何事情的感觉。我还没有尝试过struct_url解决方案。@PratikKhadloya登录链接不是要相对于当前url进行链接吗?例如例如,使用
login\u路径(@conn,:index)
将链接到
/login
login\u url(@conn,:index)
将链接到
http://example.com/login
Thank@Gazler将结构url设置为url路径确实可以将其链接到,但仍然会加载主页而不是注册页面:(
  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 = update_in(Endpoint.struct_url.host, fn (_) -> "domain2" end)
some_url(struct_url, :index)