【问题标题】:assign @changeset not available in eex template分配 @changeset 在 eex 模板中不可用
【发布时间】:2021-06-24 02:03:34
【问题描述】:

我正在尝试学习包含 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>

由控制器提供服务:

  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

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

提交表单后出现错误:

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

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

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

    这一行:

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

    引用 @changeset 预计将通过分配传递给您的 Eex 模板。在 phoenix 控制器中,您可以调用:

    render(conn, template, assigns)
    

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

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

    mix phoenix.gen.html User name surname email age:integer
    

    【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但有部分问题...我正在通过我的 page#index 像传递我的变更集

     def index(conn, _params) do
        render(conn, "index.html", %{
          :other_stuff => true,
          :changeset =>  %Ecto.Changeset{}
        })
     end
    

    在我的index.html.eex 内部,我的部分渲染如下:

    <%= render("_dialog.html", conn: @conn) %>
    

    需要传递到部分的变更集与 conn 相同,例如:

    <%= render("_dialog.html", conn: @conn, changeset: @changeset) %>
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2018-03-20
      • 2020-11-09
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多