【问题标题】:struct__/1 is undefined, cannot expand struct error Phoenix 1.3struct__/1 未定义,无法扩展结构错误 Phoenix 1.3
【发布时间】:2017-11-23 02:25:07
【问题描述】:

我正在尝试在 phoenix 1.3 应用中创建联系表单。我使用mix phx.gen.html 创建相关文件。但是,尝试启动服务器时出现编译错误:

== Compilation error on file lib/iotc/web/controllers/email_controller.ex ==
** (CompileError) lib/iotc/web/controllers/email_controller.ex:7: Email.__struct__/1 is undefined, cannot expand struct Email
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    lib/iotc/web/controllers/email_controller.ex:6: (module)
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

查看其他一些有类似问题的帖子,可能与别名有关,但我在控制器中有alias Itoc.Contact,我认为alias Iotc.Contact.Email 不会在这里。

email_controller.ex

defmodule Iotc.Web.EmailController do
  use Iotc.Web, :controller
  alias Iotc.Contact

  def index(conn, _params) do
    changeset = Email.changeset(%Email{})
    emails = Contact.list_emails()
    render(conn, "index.html", emails: emails, changeset: changeset)
  end

...

email.ex

defmodule Iotc.Contact.Email do
  use Ecto.Schema
  import Ecto.Changeset
  alias Iotc.Contact.Email


  schema "contact_emails" do
    field :email, :string
    field :event, :string
    field :message, :string
    field :name, :string

    timestamps()
  end

  @doc false
  def changeset(%Email{} = email, attrs) do
    email
    |> cast(attrs, [:name, :email, :message, :event])
    |> validate_required([:name, :email, :message, :event])
  end
end

【问题讨论】:

  • 如果您想使用名称 Email,您确实需要该别名。如果您只想为 Contact 模块起别名,也可以切换到 Contact.Email
  • OK 是有道理的。我已将控制器更新为:changeset = Contact.Email.changeset(%Contact.Email{}) 但我现在得到:warning: function Iotc.Contact.Email.changeset/1 is undefined or private. Did you mean one of: * changeset/2

标签: phoenix-framework


【解决方案1】:

关于这个

好的有道理。我已将其更新为控制器:changeset = Contact.Email.changeset(%Contact.Email{}) 但我现在得到:警告: 函数 Iotc.Contact.Email.changeset/1 未定义或私有。做过 你的意思是:* changeset/2

您在电子邮件模块中只定义了一个函数changeset/2

但是你正在做Contact.Email.changeset(%Contact.Email{}) 只传递一个参数。执行“Contact.Email.changeset(%Contact.Email{})”,它应该可以工作。

签名的/2 部分告诉您函数的arity,即需要多少个参数。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 2018-07-19
    • 2021-12-09
    • 1970-01-01
    • 2020-07-12
    • 2016-04-05
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多