(FunctionClauseError)在Access.get / 3中没有匹配的函数子句

时间:2018-06-03 23:44:32

标签: elixir

我是Elixir的新手,目前正在从Ruby进行交易。我正在努力解决我遇到的错误,因为Elixir没有object.class,我很难理解我返回的数据类型以及如何对其进行故障排除。

无论如何,我试图从CSV播种数据库,但收到错误

以下是我的代码

File.stream!('users_departs.csv')
|> Stream.drop(1)
|> CSV.decode(headers: [:name, :title, :departments])
|> Enum.take(10
|> Enum.each( fn(x) -> IO.inspect(x[:ok]) end )

 Error

** (FunctionClauseError) no function clause matching in Access.get/3

The following arguments were given to Access.get/3:

    # 1
    {:ok,
     %{
       departments: "Sales|Marketing",
       name: "John Smith",
       title: "Customer Service"
     }}

    # 2
    :ok

    # 3
    nil
(elixir) lib/access.ex:306: Access.get/3
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(stdlib) erl_eval.erl:878: :erl_eval.expr_list/6

我有两个模型,用户和部门,我想首先播种部门,然后创建一个用户,然后关联用户部门映射,但我很难通过这一步。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

Access.get/3是一个灵丹妙药函数,根据文档:

  

获取容器中给定键的值(实现Access行为的地图,关键字列表或结构)

检查错误消息,

{:ok,
   %{
     departments: "Sales|Marketing",
     name: "John Smith",
     title: "Customer Service"}}

不是“地图,关键字列表或结构等”。它是元组,由:ok原子和地图组成。

看起来,CSV.decode(headers: [:name, :title, :departments])会返回{:ok, value_decode}

所以你不能按原样将它传递给Enum.take/2

只是

{:ok, decode_csv} =
  File.stream!('users_departs.csv')
  |> Stream.drop(1)
  |> CSV.decode(headers: [:name, :title, :departments])

decode_csv
|> Enum.take(10)
|> Enum.each( fn(x) -> IO.inspect(x[:ok]) end )