分配 @changeset 在 eex 模板中不可用
assign @changeset not available in eex template
我正在尝试学习包含 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
我的模式与参数匹配,因为我在创建空变更集以将其传递给表单时遇到了一堆错误。有没有更好的解决办法?
提交表单后出现错误:
任何人都可以指出我做错了什么并提供一些信息来解决它吗?
您正在从两个操作中呈现相同的视图和模板。
这一行:
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
引用 @changeset
预计将通过分配传递给您的 Eex 模板。在凤凰控制器中,您可以通过调用:
render(conn, template, assigns)
在您的情况下,您将在 index
上传递变更集,但不会在 create
上传递。通常,您的表单将在 new
函数中呈现,参数将在 create
函数中的变更集函数中使用。
考虑生成此代码以查看其工作原理:
mix phoenix.gen.html User name surname email age:integer
我遇到了同样的问题,但有一部分...我正在通过我的 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) %>
我正在尝试学习包含 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
我的模式与参数匹配,因为我在创建空变更集以将其传递给表单时遇到了一堆错误。有没有更好的解决办法?
提交表单后出现错误:
任何人都可以指出我做错了什么并提供一些信息来解决它吗?
您正在从两个操作中呈现相同的视图和模板。
这一行:
<%= form_for @changeset, user_path(@conn, :create), fn f -> %>
引用 @changeset
预计将通过分配传递给您的 Eex 模板。在凤凰控制器中,您可以通过调用:
render(conn, template, assigns)
在您的情况下,您将在 index
上传递变更集,但不会在 create
上传递。通常,您的表单将在 new
函数中呈现,参数将在 create
函数中的变更集函数中使用。
考虑生成此代码以查看其工作原理:
mix phoenix.gen.html User name surname email age:integer
我遇到了同样的问题,但有一部分...我正在通过我的 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) %>