Ecto.Repo接收不实现Access行为的结构

时间:2018-06-18 20:57:54

标签: functional-programming elixir phoenix-framework

我的Ecto Repo和我的其中一个架构有问题 的测试即可。架构如下:

defmodule Elixirserver.Transactions.Bank do
  @behaviour Elixirserver.ContentDump

  use Ecto.Schema
  import Ecto.Changeset
  alias Elixirserver.Transactions.Account

  @attrs [:name, :code]

  schema "banks" do
    field(:name, :string)
    field(:code, :string)
    has_many(:account, Account)
    timestamps()
  end

  @doc false
  def changeset(bank, attrs \\ []) do
    bank
    |> cast(attrs, @attrs)
    |> validate_required(@attrs)
  end

  def to_json(bank) do
    %{
      id: bank.id,
      name: bank.name,
      code: bank.code,
      type: "BANK"
    }
  end
end

当我尝试执行测试时,我获得以下内容:

(UndefinedFunctionError) function 
Elixirserver.Transactions.Bank.fetch/2 is undefined 
(Elixirserver.Transactions.Bank does not implement the Access behaviour)

测试是这样的:

def create(conn, %{"bank" => bank_params}) do
  with {:ok, %Bank{} = bank} <- Transactions.create_bank(bank_params) do
    conn
    |> put_status(:created)
    |> put_resp_header("location", bank_path(conn, :show, bank))
    |> render("show.json", id: bank["id"])
  end
end

现在,显然这是因为未实现Access行为。我必须明确提供吗?

我正在使用ExMachina生成灯具,并使用mix phx.gen.json生成资源。

1 个答案:

答案 0 :(得分:1)

bank["id"]很可能就是问题所在。结构不实现访问接口,您应该使用点,这应该工作:bank.id

可以找到详细信息here