【问题标题】:Trouble with Phoenix / Ecto ChangesetPhoenix / Ecto Changeset 的问题
【发布时间】:2017-05-30 21:44:59
【问题描述】:

我在 Ecto Changeset 上度过了一段糟糕的时光。我试图简单地创建一个带有“空”变更集的新表单。控制器被击中并调用Session.changeset(%Session{}) 行。然后点击Site.Session.changeset。在那里,cast 调用失败并出现以下错误。这个完整的堆栈跟踪如下。 Elixir 1.4,伞形应用。

控制器:

defmodule Site.SessionController do
  use Site.Web, :controller
  alias Site.Session

  def login_form(conn, _params) do
    changeset = Session.changeset(%Session{})
    conn |> render "login_form.html", changeset: changeset
  end
end

模块:

defmodule Site.Session do
  import Ecto.Changeset

  defstruct [:email, :password]

  @required_fields ~w(email password)
  @optional_fields ~w()

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @required_fields ++ @optional_fields)
  end
end

错误:

function Site.Session.__changeset__/0 is undefined or private. Did you mean one of:
      * changeset/1
      * changeset/2

堆栈跟踪:

Request: GET /login
** (exit) an exception was raised:
    ** (UndefinedFunctionError) function Site.Session.__changeset__/0 is undefined or private. Did you mean one of:

      * changeset/1
      * changeset/2

        (site) Site.Session.__changeset__()
        (ecto) lib/ecto/changeset.ex:422: Ecto.Changeset.do_cast/4
        (site) web/controllers/session_controller.ex:9: Site.SessionController.login_form/2
        (site) web/controllers/session_controller.ex:3: Site.SessionController.action/2
        (site) web/controllers/session_controller.ex:3: Site.SessionController.phoenix_controller_pipeline/2
        (site) lib/site/endpoint.ex:1: Site.Endpoint.instrument/4
        (site) lib/phoenix/router.ex:261: Site.Router.dispatch/2
        (site) web/router.ex:1: Site.Router.do_call/2
        (site) lib/site/endpoint.ex:1: Site.Endpoint.phoenix_pipeline/1
        (site) lib/plug/debugger.ex:123: Site.Endpoint."call (overridable 3)"/2
        (site) lib/site/endpoint.ex:1: Site.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) 

【问题讨论】:

  • 可能是因为您还没有为Site.Session 声明“模式”。如果没有定义架构的结构,我认为 cast 无法工作。
  • 我可以发誓我几个小时前就试过了。 /头++办公桌。谢谢:)

标签: elixir phoenix-framework ecto changeset


【解决方案1】:

Dogbert 上面的评论是正确的。我错过了架构。我在想它不会被持久化,我在模块中有一个defstruct,但是唉:不要忘记架构,孩子们。

defmodule Site.Session do
  use Ecto.Schema
  import Ecto.Changeset

  @required_fields ~w(email password)
  @optional_fields ~w()

  schema "sessions" do
    field :email, :string
    field :password, :string
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @required_fields ++ @optional_fields)
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多