__struct __ / 1 не определен, не может расширить 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

любая идея ?


person Uj Corb    schedule 08.02.2018    source источник
comment
Вы должны либо отметить ответ как правильный, либо предоставить свой собственный ответ и отметить его как правильный, прежде чем задавать новые вопросы.   -  person Aleksei Matiushkin    schedule 10.02.2018


Ответы (1)


Ваш Gazette.User - обычный модуль, он не превратится в структуру автоматически. Чтобы сделать из него Ecto схему, вам необходимо:

use Ecto.Schema

Я не уверен, что делает use Gazette.Web, :model, но считаю, что он устарел или что-то в этом роде. При определении схем всегда лучше быть явным.

Вам также может потребоваться / необходимо:

import Ecto.Changeset
import Ecto.Query

Этот код мог быть создан автоматически с помощью старой mix phx.gen.model задачи. Вместо этого вы хотите использовать mix phx.gen.schema, чтобы получить правильный шаблон.

person Aleksei Matiushkin    schedule 08.02.2018
comment
Это действительно была проблема. Gazette.Web устарел; Я добавил `use Ecto.Schema import Ecto.Changeset alias Gazette.User`, но столкнулся с некоторыми новыми ошибками. Поскольку я был в самом начале своего проекта, я просто перезапустил его с нуля и использовал правильную команду смешивания для создания таблиц в моей БД. - person Uj Corb; 08.02.2018
comment
Да,: модель устарела в 2015 году, когда был выпущен Ecto 1.1. Эти старые учебники опасны! - person Mark Wilbur; 10.02.2018
comment
аргх два часа !! Документация такая запутанная :( - person user1230795; 04.09.2018