You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phoenix应用编译报错:未定义函数payout/0问题咨询

问题分析与解决

你的编译错误是因为with语句第一行的写法存在语法歧义,导致编译器误将变量payout识别为0元函数payout()调用。

原代码中:

with %Payout{} <- payout = Repo.get(Payout, id),

虽然理论上这种写法在Elixir中合法(先执行payout = Repo.get(...)绑定变量,再用%Payout{}匹配结果),但编译器对该写法的解析容易出现歧义,从而抛出undefined function payout/0的错误。

修正方案

将变量绑定与模式匹配合并为更清晰的写法,消除歧义:

def toggle_complete(conn, %{"id" => id} = _params, _current_user, _claims) do
    with %Payout{} = payout <- Repo.get(Payout, id),
         {_count, nil} <- Payouts.toggle_prize_claims(payout),
         {:ok, payout} <- Payouts.toggle_complete(payout) do
      conn |> render("payout_simple.json", payout: payout)
    else
      nil -> {:error, :payout_not_found}
      error -> error
    end
end

或者拆分为两个with子句,分步完成变量绑定和模式匹配:

def toggle_complete(conn, %{"id" => id} = _params, _current_user, _claims) do
    with payout <- Repo.get(Payout, id),
         %Payout{} = payout,
         {_count, nil} <- Payouts.toggle_prize_claims(payout),
         {:ok, payout} <- Payouts.toggle_complete(payout) do
      conn |> render("payout_simple.json", payout: payout)
    else
      nil -> {:error, :payout_not_found}
      error -> error
    end
end

这两种写法都能明确告诉编译器:先从数据库获取记录并绑定到payout变量,再确认该记录是%Payout{}结构体实例,消除歧义后编译即可通过。

内容的提问来源于stack exchange,提问作者tmariaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:55:25