Ecto.Repo 接收未实现访问行为的结构

Bru*_*ipa 5 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
Run Code Online (Sandbox Code Playgroud)

当我尝试执行测试时,我获得以下信息:

(UndefinedFunctionError) function 
Elixirserver.Transactions.Bank.fetch/2 is undefined 
(Elixirserver.Transactions.Bank does not implement the Access behaviour)
Run Code Online (Sandbox Code Playgroud)

测试是这样的:

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
Run Code Online (Sandbox Code Playgroud)

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

我正在使用 ExMachina 生成装置,并使用mix phx.gen.json.

NoD*_*ame 9

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

可在此处找到详细信息。