【问题标题】:Compile Error - User.__struct__/1 is undefined, cannot expand struct User编译错误 - User.__struct__/1 未定义,无法扩展 struct User
【发布时间】:2020-08-27 04:00:57
【问题描述】:

我正在按照Programming Phoenix 1.4 的书构建一个简单的应用程序。

在添加逻辑以创建新用户时,我收到此错误:

== Compilation error in file lib/rumbl_web/controllers/user_controller.ex ==
** (CompileError) lib/rumbl_web/controllers/user_controller.ex:19: Rubml.Accounts.User.__struct__/1 is undefined, cannot expand struct Rubml.Accounts.User. Make sure the struct name is correct. If the struct name exists and is correct but it still cannot be found, you likely have cyclic module usage in your code
    (stdlib 3.12.1) lists.erl:1354: :lists.mapfoldl/3
    lib/rumbl_web/controllers/user_controller.ex:18: (module)
    (stdlib 3.12.1) erl_eval.erl:680: :erl_eval.do_apply/6

我已经仔细检查过,我认为我没有遗漏任何内容或有任何拼写错误。

这是我的控制器:

defmodule RumblWeb.UserController do
    use RumblWeb, :controller

    alias Rumbl.Accounts
    alias Rubml.Accounts.User

    def index(conn, _params) do
        users = Accounts.list_users()
        # IO.puts users
        render(conn, "index.html", users: users)
    end

    def show(conn, %{"id" => id}) do
        user = Accounts.get_user(id)
        render(conn, "show.html", user: user)
    end

    def new(conn, _params) do
        changeset = Accounts.change_user(%User{})
        render(conn, "new.html", changeset: changeset)
    end
end

以及用户模型:


defmodule Rumbl.Accounts.User do
    use Ecto.Schema
    import Ecto.Changeset

    schema "users" do
        field :name, :string
        field :username, :string

        timestamps()
    end

    def changeset(user, attrs) do
        user
        |> cast(attrs, [:name, :username])
        |> validate_required([:name, :username])
        |> validate_length(:username, min: 1, max: 20)
    end
end

如果有人想探索,这里是回购链接:https://github.com/niranjans/rumbl

【问题讨论】:

    标签: elixir phoenix-framework phoenix


    【解决方案1】:

    我的文件路径错误:rumbl/accounts/user.ex 而不是rumbl/lib/rumbl/accounts/user.ex

    然后退出并重新输入iex -S mix

    (我在后台运行mix phx.server,但如果它有什么不同,我不知道)

    【讨论】:

      【解决方案2】:

      alias Rubml.Accounts.User 中有错字 -- Rubml 应该是 Rumbl。 (我想我在阅读那本书时犯了同样的错误)。

      外卖应该是当找不到模块时:

      1. 使用区分大小写的搜索对模块名称的拼写/大写进行三次检查。
      2. 选择对别名友好的命名约定 - 留意其段与模块命名相同的别名。

      【讨论】:

      • 啊!不敢相信我在仔细检查了所有内容后错过了它:p 谢谢!
      猜你喜欢
      • 2018-07-19
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多