elixir - 分配 @changeset 在 eex 模板中不可用

标签 elixir phoenix-framework ecto

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

<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>

由 Controller 提供服务:
  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

和模型:
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

我的模式匹配了参数,因为我在创建空变更集以将其传递给表单时遇到了一堆错误。有没有更好的办法呢?

提交表单后出现错误:
enter image description here

谁能指出我做错了什么并提供一些信息来解决它?

最佳答案

您正在从两个操作呈现相同的 View 和模板。

这一行:

<%= form_for @changeset, user_path(@conn, :create), fn f -> %>

引用文献 @changeset预计将通过分配传递给您的 Eex 模板。在 phoenix Controller 中,您可以通过调用:
render(conn, template, assigns)

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

考虑生成此代码以查看其工作原理:
mix phoenix.gen.html User name surname email age:integer

关于elixir - 分配 @changeset 在 eex 模板中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982990/

相关文章:

rabbitmq - 为什么 RabbitMQ 中的消息优先级不对我的消息进行排序?

elixir - 如何使用 Phoenix channel 直接回复用户的消息?

elixir - Ecto 模型变更集错误

postgresql - 如何使用 PostgreSQL 在 Ecto 中使用点列类型

erlang - 为什么 Pry shell 在 Phoenix/cowboy 中超时如此之快? (shell 进程退出的原因是 : shutdown)

maps - 如何从嵌套映射中获取值

caching - 不使用保护子句过滤 erlang ets 表

sass - 使用 Brunch 将 TailwindCSS 添加到 Phoenix

postgresql - Postgres 9.4+ 中 JSONB 嵌入式 Ecto2 模型的索引

elixir - 如何使用 Ecto 对模型删除设置 foreign_key_constraint?