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

Elixir中Storex.Accounts模块方法无法调用问题求助

问题分析与解决方案

你遇到的这个问题本质上是Elixir模块没有被正确编译或加载到iex会话中,分两种场景来拆解原因:

为什么一开始只有mark_as_admin/1调用失败?

当你启动iex时,它会加载当时项目中已编译好的模块版本。你是在启动iex之后才添加的mark_as_admin/1方法,此时iex里的Storex.Accounts还是旧版本——也就是没有这个新函数的版本,所以调用时会提示函数未定义;而其他方法是之前就存在的,自然能正常调用。

为什么重启iex后所有方法都调用失败?

这说明你重启iex时没有正确启动整个应用,导致Storex.Accounts模块根本没被加载。直接用iex命令启动的话,它只会加载Elixir核心模块,不会自动编译和加载你的项目自定义代码。


解决步骤

1. 先排查编译错误

首先在终端(不是iex会话内)运行:

mix compile

这一步会检查所有代码的语法和依赖问题——比如你在mark_as_admin/1里用到了User.admin_changeset/2,如果这个函数在Storex.Accounts.User模块里不存在,编译会直接报错,这也是模块无法更新的常见原因。如果有错误,先修复这些编译问题。

2. 正确启动iex并加载应用

不要直接用iex启动,而是执行:

iex -S mix

这个命令会自动编译项目代码,并且完整启动你的storex应用,所有自定义模块都会被正确加载。

3. 在已有iex会话中更新模块

如果不想重启iex,在当前会话里先编译再重新加载目标模块:

# 先编译项目代码
iex> mix compile
# 重新加载Storex.Accounts模块
iex> r Storex.Accounts

之后再调用Accounts.mark_as_admin(user)就应该能正常工作了。


验证示例:用iex -S mix启动后,执行以下操作应该能看到预期结果:

iex> user = Accounts.get_user!(7)
[debug] QUERY OK source="accounts_users" db=2.2ms SELECT a0."id", a0."email", a0."full_name", a0."password_hash", a0."is_admin", a0."inserted_at", a0."updated_at" FROM "accounts_users" AS a0 WHERE (a0."id" = $1) [7]
%Storex.Accounts.User{is_admin: false, ...}
iex> Accounts.mark_as_admin(user)
[debug] QUERY OK db=1.8ms UPDATE "accounts_users" SET "is_admin" = $1, "updated_at" = $2 WHERE "id" = $3 [true, ~N[2024-XX-XX XX:XX:XX], 7]
{:ok, %Storex.Accounts.User{is_admin: true, ...}}

内容的提问来源于stack exchange,提问作者David B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:49