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
相关产品推荐
相关产品推荐

