在eex模板中指定@changeset不可用

Hai*_*ito 4 elixir ecto phoenix-framework

我正在尝试学习Phoenix的Form系统,包括Ecto.Model,但我遇到了一个我无法通过的问题.我创建了一个表单:

<div class="jumbotron">
  <%= form_for @changeset, user_path(@conn, :create), fn f -> %>
    <label>
      Login: <%= text_input f, :login %>
    </label>
    <label>
      Password: <%= password_input f, :password %>
    </label>
    <label>
      Name: <%= text_input f, :name %>
    </label>
    <label>
      Surname: <%= text_input f, :name %>
    </label>
    <label>
      Email: <%= email_input f, :name %>
    </label>
    <label>
      Class: <%= text_input f, :name %>
    </label>
    <label>
      Phone: <%= text_input f, :name %>
    </label>

    <%= submit "Submit" %>
  <% end %>
</div>
Run Code Online (Sandbox Code Playgroud)

这是由财务主任提供的:

  def index(conn, _params) do
    changeset = User.changeset(%User{})
    render conn, "index.html", changeset: changeset
  end

  def create(conn, _params) do
    IO.inspect(_params)
    render conn, "index.html"
  end
Run Code Online (Sandbox Code Playgroud)

而型号:

defmodule Kpsz.Model.User do
  use Kpsz.Web, :model

  schema "users" do
    field :login, :string
    field :password, :string
    field :email, :string

    field :role, :integer

    field :name, :string
    field :surname, :string
    field :class, :string
    field :phone_number, :string

    has_many :presences, Kpsz.Model.Presence
  end

  @required_fields ~w(login,password,email,name,surname,class,phone_number)
  @optional_fields ~w(role)

  def changeset(user, params \\ :empty) do
    case params do
      :empty -> cast(user,params, ~w(),~w())
      _ -> user
        |> cast(params, @required_fields, @optional_fields)
        |> validate_format(:email, ~r/@/)
        |> unique_constraint(:email)
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

我有模式匹配params,因为我在创建空的变更集时将一堆错误传递给表单.有没有更好的方法呢?

提交表单后我收到错误: 在此输入图像描述

任何人都可以指出我做错了什么,并提供一些信息如何解决它?

Gaz*_*ler 7

您正在从这两个操作呈现相同的视图和模板.

这一行:

<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
Run Code Online (Sandbox Code Playgroud)

参考文献@changeset预计将通过转让传递给你EEX模板.在凤凰控制器中,您可以通过调用:

render(conn, template, assigns)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您正在传递变更集index但不是create.通常,您的表单将在new函数中呈现,params将在函数的changeset函数中使用create.

考虑生成此代码以查看其工作原理:

mix phoenix.gen.html User name surname email age:integer
Run Code Online (Sandbox Code Playgroud)