首页 > 解决方案 > 如何解决 lib/.../views/user_view.ex:16: undefined function user_path/3 编译错误

问题描述

试图添加一个用户视图和用户控制器,但我得到一个奇怪的编译错误。

通过查看Programming Phoenix: undefined function page_path/2我怀疑它也与生成的文件有关,但我仍然不明白如何解决它

这是我在控制器文件夹中的 user_controller.ex:

defmodule ChatterWeb.UserController do
  use ChatterWeb, :controller
  alias Chatter.User

  def index(conn, _params) do
    users = Repo.all(User)
    render(conn, "index.html", users: users)
  end
end

这是我在视图文件夹中的 user_view.ex:

defmodule ChatterWeb.UserView do
  use ChatterWeb, :view
end

这是我的 router.ex 中的路由部分:

  scope "/", ChatterWeb do
    pipe_through :browser
    resources "/users", UserController
    get "/", PageController, :index
  end

这是我的 user.ex (具有架构):

defmodule Chatter.User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    field :email, :string
    field :encrypt_pass, :string
    field :password, :string, virtual: true

    timestamps()
  end

  @doc false
  def changeset(user, attrs) do
    user
    |> cast(attrs, [:email, :password])
    |> validate_required([:email, :password])
    |> unique_constraint(:email)
  end
end

这是我在编译时遇到的错误:

== Compilation error in file lib/chatter_web/views/user_view.ex ==
** (CompileError) lib/chatter_web/views/user_view.ex:16: undefined function user_path/3
    (elixir) src/elixir_locals.erl:107: :elixir_locals."-ensure_no_undefined_local/3-lc$^0/1-0-"/2
    (elixir) src/elixir_locals.erl:107: anonymous fn/3 in :elixir_locals.ensure_no_undefined_local/3
    (stdlib) erl_eval.erl:680: :erl_eval.do_apply/6
    (elixir) lib/kernel/parallel_compiler.ex:208: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6

我不明白为什么ex:16文件只有 3 行代码。我猜这个use关键字会从不同的文件中注入代码,但这使得很难确定它到底哪里出了问题。

标签: elixirphoenix-framework

解决方案


显然,ex:16inlib/chatter_web/views/user_view.ex:16实际上是指lib/chatter_web/templates/user/index.html.eex. 我不明白为什么。但是在那个文件中,当它应该是 Routes.user_path(@conn, :show, user) 时,我指的是 user_path(@conn, :show, user)。从Undefined [controller]_path for route with two params了解到这一点(我相信这是由于 1.4.3 文档)


推荐阅读