画面にフォームを表示しようとしています。しかし、サーバーを起動しようとすると、このエラーが発生し続けます。 locations_controller.ex == ** (CompileError) web/controllers/locations_controller.ex:5: Locations.__struct__/1 is undefined, cannot expand struct Locations
。ところで私はエリクサーに新しいので、私はおそらく本当に明らかな間違いをしているでしょう。
これが私のコードです:
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
<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
Elixirのモジュールは、フルネームまたはそのalias
で参照する必要があります。すべてのLocations
をAwesomeLunch.Locations
に変更するか、短い名前を使用する場合は、そのモジュールでalias
を呼び出すことができます。
defmodule AwesomeLunch.LocationsController do
alias AwesomeLunch.Locations
...
end
アンブレラプロジェクトを開発していて、同じエラーが何度か発生しました。
App1
で宣言された構造体を作成し、App2
で使用する場合は、App1
をApp2
に依存関係として追加する必要があります。これを行わず、App2
がApp1
の前にロードされた場合、エラーが発生します。
私は同じエラーを抱えていて、私にとってはこのようにコントローラーを構成することができました:
defmodule AwesomeLunch.LocationsController do
use AwesomeLunch.Web, :controller
alias AwesomeLunch.Locations
...
end