Не удается расширить struct-elixir/phoenix

Я пытаюсь отобразить форму на экране. Но я продолжаю получать эту ошибку, когда пытаюсь запустить сервер. locations_controller.ex == ** (CompileError) web/controllers/locations_controller.ex:5: Locations.__struct__/1 is undefined, cannot expand struct Locations. BTW Я новичок в эликсире, поэтому я, вероятно, делаю что-то действительно очевидное.

Вот мой код:

locations.controller.ex

 def new(conn, _params) do
    changeset = Locations.changeset(%Locations{})

    render conn, "new.html", changeset: changeset
  end

  def create(conn, %{"locations" => %{ "start" => start, "end" => finish }}) do
    changeset = %AwesomeLunch.Locations{start: start, end: finish}
    Repo.insert(changeset)

    redirect conn, to: locations_path(conn, :index)
  end

VIEW

<h1>Hey There</h1>

<%= form_for @changeset, locations_path(@conn, :create), fn f -> %>

  <label>
    Start: <%= text_input f, :start %>
  </label>

  <label>
    End: <%= text_input f, :end %>
  </label>

  <%= submit "Pick An Awesome Lunch" %>

<% end %>

модель

    defmodule AwesomeLunch.Locations do
  use AwesomeLunch.Web, :model

  use Ecto.Schema
  import Ecto.Changeset

  schema "locations" do
    field :start
    field :end
  end

  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [:start, :end])
    |> validate_required([:start, :end])
  end
end

Как я уже сказал, я получаю эту ошибку:

    locations_controller.ex ==
** (CompileError) web/controllers/locations_controller.ex:5: Locations.__struct__/1 is undefined, cannot expand struct Locations

Ответ 1

Модули в Elixir должны быть указаны по их полному имени или alias. Вы можете либо изменить все Locations на AwesomeLunch.Locations, либо если вы хотите использовать более короткое имя, вы можете вызвать alias в этом модуле:

defmodule AwesomeLunch.LocationsController do
  alias AwesomeLunch.Locations

  ...
end

Ответ 2

Я разрабатываю зонтичный проект и несколько раз получаю одну и ту же ошибку.

Если вы создаете структуру, объявленную в App1, и хотите использовать ее в App2, вы должны добавить App1 в App2 в качестве зависимости. Если вы этого не сделаете и если App2 загружен до App1, произойдет ошибка.

Пример: {:app1, in_umbrella: true}

Ответ 3

У меня была такая же ошибка, и для меня это работало с настройкой контроллера, таким образом:

defmodule AwesomeLunch.LocationsController do
  use AwesomeLunch.Web, :controller

  alias AwesomeLunch.Locations

  ...
end