__struct__/1 未定义,无法扩展结构 Gazette.User
__struct__/1 is undefined, cannot expand struct Gazette.User
我正在构建一个 Phoenix 1.3 应用程序,但是按照 1.2 Pheonix 教程,我 运行 弃用了 mix phoenix.gen.model
我不确定它是否已链接,但现在我收到此错误:
== Compilation error in file lib/gazette_web/controllers/user_controller.ex ==
** (CompileError) lib/gazette_web/controllers/user_controller.ex:12: Gazette.User.__struct__/1 is undefined, cannot expand struct Gazette.User
lib/gazette_web/controllers/user_controller.ex:11: (module)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/kernel/parallel_compiler.ex:121: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
这是我的 user_controller.ex 文件:
defmodule Gazette.UserController do
use GazetteWeb, :controller
alias Gazette.User
def show(conn, %{"id" => id}) do
user = Repo.get!(User,id)
render(conn, "show.html", user: user)
end
def new(conn, _params) do
changeset = User.changeset(%User{})
render conn, "new.html", changeset: changeset
end
def create(conn, %{"user" => user_params}) do
# here will be an implementation
end
end
这是我的 model/user.ex 文件:
defmodule Gazette.User do
use Gazette.Web, :model
schema "users" do
field :email, :string
field :name, :string
field :password, :string, virtual: true
field :password_hash, :string
field :is_admin, :string
field :is_writer, :string
has_many :posts, Gazette.Post
timestamps()
end
@required_fields ~w(email name)a
@optional_fields ~w(is_admin is_writer)a
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \ %{}) do
struct
|> cast(params, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
end
end
有什么想法吗?
你的 Gazette.User
是一个常规模块,它不会自动转换为结构。要从中创建一个 Ecto
架构,您需要:
use Ecto.Schema
我不确定 use Gazette.Web, :model
的作用,但我相信它已被弃用或发生了什么。定义模式时最好明确。
您还可以 want/need 到:
import Ecto.Changeset
import Ecto.Query
此代码可能是使用旧的 mix phx.gen.model
任务自动生成的。相反,您想使用 mix phx.gen.schema
以获得正确的样板文件。
我正在构建一个 Phoenix 1.3 应用程序,但是按照 1.2 Pheonix 教程,我 运行 弃用了 mix phoenix.gen.model
我不确定它是否已链接,但现在我收到此错误:
== Compilation error in file lib/gazette_web/controllers/user_controller.ex ==
** (CompileError) lib/gazette_web/controllers/user_controller.ex:12: Gazette.User.__struct__/1 is undefined, cannot expand struct Gazette.User
lib/gazette_web/controllers/user_controller.ex:11: (module)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(elixir) lib/kernel/parallel_compiler.ex:121: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1
这是我的 user_controller.ex 文件:
defmodule Gazette.UserController do
use GazetteWeb, :controller
alias Gazette.User
def show(conn, %{"id" => id}) do
user = Repo.get!(User,id)
render(conn, "show.html", user: user)
end
def new(conn, _params) do
changeset = User.changeset(%User{})
render conn, "new.html", changeset: changeset
end
def create(conn, %{"user" => user_params}) do
# here will be an implementation
end
end
这是我的 model/user.ex 文件:
defmodule Gazette.User do
use Gazette.Web, :model
schema "users" do
field :email, :string
field :name, :string
field :password, :string, virtual: true
field :password_hash, :string
field :is_admin, :string
field :is_writer, :string
has_many :posts, Gazette.Post
timestamps()
end
@required_fields ~w(email name)a
@optional_fields ~w(is_admin is_writer)a
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \ %{}) do
struct
|> cast(params, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
end
end
有什么想法吗?
你的 Gazette.User
是一个常规模块,它不会自动转换为结构。要从中创建一个 Ecto
架构,您需要:
use Ecto.Schema
我不确定 use Gazette.Web, :model
的作用,但我相信它已被弃用或发生了什么。定义模式时最好明确。
您还可以 want/need 到:
import Ecto.Changeset
import Ecto.Query
此代码可能是使用旧的 mix phx.gen.model
任务自动生成的。相反,您想使用 mix phx.gen.schema
以获得正确的样板文件。