首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Phoenix / Ecto Changeset带来的麻烦

Phoenix / Ecto Changeset带来的麻烦
EN

Stack Overflow用户
提问于 2017-05-28 23:55:31
回答 1查看 677关注 0票数 2

我在使用Ecto Changeset时遇到了很糟糕的情况。我只想创建一个带有“空”Changeset的新表单。命中控制器并调用Session.changeset(%Session{})行。然后它会命中Site.Session.changeset。在这里,cast调用失败,并显示以下错误。下面是完整的堆栈跟踪。灵丹妙药1.4,雨伞应用程序。

控制器:

代码语言:javascript
复制
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

该模块:

代码语言:javascript
复制
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

错误:

代码语言:javascript
复制
function Site.Session.__changeset__/0 is undefined or private. Did you mean one of:
      * changeset/1
      * changeset/2

堆栈跟踪:

代码语言:javascript
复制
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) 
EN

回答 1

Stack Overflow用户

发布于 2017-05-29 00:12:45

Dogbert上面的评论是正确的。我错过了这个模式。我认为它不会持久化,并且我在模块中有一个defstruct,但是遗憾的是:孩子们,不要忘记模式。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44229264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档