首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Plug.Conn.Unfetched不实现访问行为。

Plug.Conn.Unfetched不实现访问行为。
EN

Stack Overflow用户
提问于 2016-11-23 02:26:16
回答 1查看 3.1K关注 0票数 3

从下面的代码中,当我调用conn.params["geo"]时,会得到以下错误:

代码语言:javascript
复制
test/plugs/geoip_test.exs:4
 ** (UndefinedFunctionError) function Plug.Conn.Unfetched.fetch/2 is undefined  (Plug.Conn.Unfetched does not implement the Access behaviour)
 stacktrace:
   (plug) Plug.Conn.Unfetched.fetch(%{:__struct__ => Plug.Conn.Unfetched, :aspect => :params, "geo" => "Mountain View, US", "ip" => "8.8.8.8"}, "geo")

..。

代码语言:javascript
复制
defmodule AgilePulse.Plugs.GeoIPTest do
  use AgilePulse.ConnCase

  test "returns Mountain View for 8.8.8.8" do
    conn = build_conn
    params = Map.put(conn.params, "ip", "8.8.8.8")
    conn = Map.put(conn, :params, params) |> AgilePulse.Plugs.GeoIP.call(%{})

    assert conn.params["geo"] == "Mountain View, US"
  end

end

defmodule AgilePulse.Plugs.GeoIP do
  import Plug.Conn

  def init(opts), do: opts

  def call(%Plug.Conn{params: %{"ip" => ip}} = conn, _opts) do
    geo = set_geo(ip)
    params = Map.put(conn.params, "geo", geo)
    Map.put(conn, :params, params)
  end

  def call(conn, _opts), do: conn

  ...

end

有人能告诉我为什么会失败吗?什么是合适的解决方案?泰!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-23 05:10:08

简单回答:更改如下:

代码语言:javascript
复制
params = Map.put(conn.params, "ip", "8.8.8.8")

至:

代码语言:javascript
复制
params = %{"ip": "8.8.8.8"}

说明:Phoenix.ConnTest.build_conn/0返回一个params设置为%Plug.Conn.Unfetched{}Conn。通过对此使用Map.put,您不会重置__struct__的值,而是只添加一个新键:

代码语言:javascript
复制
%Plug.Conn{ ...,
 params: %{:__struct__ => Plug.Conn.Unfetched, :aspect => :params,
   "ip" => "8.8.8.8"}, ... }

稍后调用params["geo"]时,Elixir会看到params是一个结构,并尝试在结构的模块上调用fetch/2函数,这个模块并不存在。要将params重置为普通映射(以便在使用方括号语法时,Elixir调用Map.get ),只需执行params = %{"ip": "8.8.8.8"}即可。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40755018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档