编译错误 - User.__struct__/1 未定义,无法扩展 struct User

Ayr*_*nna 5 elixir phoenix-framework

我正在按照这本书构建一个简单的应用程序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
Run Code Online (Sandbox Code Playgroud)

我已经仔细检查过,不认为​​我错过了任何内容或有任何拼写错误。

这是我的控制器:

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

和用户模型:


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

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

Eve*_*ett 6

你的拼写错误是alias Rubml.Accounts.User——Rubml应该是Rumbl。(我想我在读完那本书时也犯了同样的错误)。

结论应该是,当找不到模块时:

  1. 使用区分大小写的搜索对模块名称的拼写/大写进行三次检查。
  2. 选择别名友好的命名约定——留意其段与模块命名相同的别名。
  3. 确保您的模块位于lib/目录内 - 默认情况下,仅编译某些目录,因此请确保您的文件位于正确的位置