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