Elixir Phoenix/Exto变更集出现问题
我和外星变形金刚玩得很不开心。我试图简单地创建一个带有“空”变更集的新表单。点击控制器并调用Elixir Phoenix/Exto变更集出现问题,elixir,phoenix-framework,ecto,changeset,Elixir,Phoenix Framework,Ecto,Changeset,我和外星变形金刚玩得很不开心。我试图简单地创建一个带有“空”变更集的新表单。点击控制器并调用Session.changeset(%Session{})行。然后点击Site.Session.changeset。在那里,cast调用失败,出现以下错误。下面是完整的堆栈跟踪。Elixir 1.4,雨伞应用程序 控制员: defmodule Site.SessionController do use Site.Web, :controller alias Site.Session def
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)
多伯特的上述评论是正确的。我错过了模式。我想它不会被持久化,我在模块中有一个
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
可能是因为您尚未为
Site.Session
声明“架构”。我认为如果结构没有定义模式,cast
是不起作用的。我可以发誓我几个小时前就试过了/头放在桌子上。谢谢:)