显示同一eex模板中两个模式的相关数据

时间:2016-09-25 05:25:57

标签: elixir phoenix-framework ecto

我试图在表单中显示一些相关数据。我有学生模式

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模板编辑它们也会很棒。感谢。

1 个答案:

答案 0 :(得分:1)

您需要在has_many模型中使用cast_assocStudent

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中为StudentControlleredit操作预加载update

student = Repo.get!(Student, id) |> Repo.preload(:parents)

代码 - https://github.com/shhavel/stackoverflow-questions-39683691