我试图在表单中显示一些相关数据。我有学生模式
schema "students" do
field :firstname, :string
field :lastname, :string
field :birthday, Ecto.Date
field :joined_on, Ecto.Date
field :gender, :string
timestamps()
end
每个学生都可以有一个母亲和一个父亲,这些我已经将它们指定为父母,并创建了一个单独的模式和单独的表格。每个父记录可以与最多1个学生链接(奇数,但适用于我的用例)。
schema "parents" do
field :relationship, :string
field :fullname, :string
field :qualification, :string
belongs_to :student, Myapp.Student, foreign_key :student_id
timestamps()
end
我正在尝试创建一个表单,我可以同时创建新的学生和家长。因此,将以相同的形式为学生和母亲和父亲的领域提供领域。我已经尝试了多种方法在eex模板中获取这些Parent数据,但我没有做到。
以下是我在new
控制器的Student
方法中使用的内容:
def new (conn, _params) do
changeset = Student.changeset(%Student{})
render(conn, "new.html", [changeset: changeset])
end
我认为这里有问题,因为当我使用Html助手时,我无法获得eex表单中的parents
字段。我希望能够同时创造新的学生,父母。如果我可以使用相同的eex模板编辑它们也会很棒。感谢。
答案 0 :(得分:1)
您需要在has_many
模型中使用cast_assoc
和Student
:
defmodule Myapp.Student do
use Myapp.Web, :model
schema "students" do
field :firstname, :string
field :lastname, :string
field :birthday, Ecto.Date
field :joined_on, Ecto.Date
field :gender, :string
has_many :parents, Myapp.Parent
timestamps()
end
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:firstname, :lastname, :birthday, :joined_on, :gender])
|> cast_assoc(:parents)
|> validate_required([:firstname, :lastname, :birthday, :joined_on, :gender])
end
end
在web/templates/student/form.html.eex
中使用inputs_for
:
<%= inputs_for f, :parents, fn pf -> %>
<h3>Parent form</h3>
<div class="form-group">
<%= label pf, :relationship, class: "control-label" %>
<%= text_input pf, :relationship, class: "form-control" %>
<%= error_tag pf, :relationship %>
</div>
<div class="form-group">
<%= label pf, :fullname, class: "control-label" %>
<%= text_input pf, :fullname, class: "form-control" %>
<%= error_tag pf, :fullname %>
</div>
<div class="form-group">
<%= label pf, :qualification, class: "control-label" %>
<%= text_input pf, :qualification, class: "form-control" %>
<%= error_tag pf, :qualification %>
</div>
<% end %>
您可以在学生控制器操作new
中构建两个父级:
alias Myapp.Parent
def new(conn, _params) do
changeset = Student.changeset(%Student{parents: [%Parent{}, %Parent{}]})
render(conn, "new.html", changeset: changeset)
end
还需要在:parents
中为StudentController
和edit
操作预加载update
:
student = Repo.get!(Student, id) |> Repo.preload(:parents)
代码 - https://github.com/shhavel/stackoverflow-questions-39683691