Elixir Phoenix全球变量插头

时间:2015-11-23 08:35:48

标签: elixir phoenix-framework

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

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

在lib / myapp / endpoint.ex

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

这个插头有什么问题吗?

编辑:根据回复修复了“if”条件。

2 个答案:

答案 0 :(得分:6)

url来自endpoint.url而不是host Plug.Conn生成 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

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

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

您可以使用struct_url/0

覆盖此内容
_path

您还可以为第二个域定义第二个端点。如果您的链接是内部链接,那么您应该考虑使用_url函数而不是_url函数。通常在需要域时使用for (NSDictionary *dict in [mainDict valueForKey:@"profile_pic"]) { [imgArr addObject:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[dict valueForKey:@"thumb_nail"]]]]; } if (imgArr.count >0) { [cell.imgViewUserImage sd_setAnimationImagesWithURLs:imgArr]; cell.imgViewUserImage.animationDuration = imgArr.count*2; [cell.imgViewUserImage startAnimating]; } 助手(例如电子邮件。)

答案 1 :(得分:3)

您的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