2017-05-28 11 views
0

私はEcto Changesetでひどい時を過ごしています。私は単に "空の"チェンジセットで新しいフォームを作成しようとしています。コントローラーがヒットし、Session.changeset(%Session{})行が呼び出されます。その後、Site.Session.changesetにヒットします。そこでは、cast呼び出しが以下のエラーで失敗します。この完全なスタックトレースは以下の通りです。エリクサー1.4、傘アプリ。Phoenix/Ecto Changesetのトラブル

コントローラ:

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) 
+1

おそらく、あなたが「Site.Session」に「スキーマ」を宣言していないためです。スキーマが定義されている構造体がなければ、 'cast'は動作しないと思います。 – Dogbert

+0

私はその数時間前に誓ったことがありました。/head ++デスク。ありがとう:) –

答えて

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