Phoenix HTML - 如何生成嵌套表单

时间:2016-07-02 15:16:18

标签: elixir phoenix-framework

我来自PHP Symfony2框架。想象一下,你有模型UserAddress

schema "users" do
  field :name, :string
  has_many :addresses, App.Address
end
schema "addresses" do
  field :street, :string
  field :city, :string
  ...
  belongs_to :user, App.User
end

我想为User创建包含多个Address子表单的表单。我已阅读Working with Ecto associations and embeds,其中介绍了如何编辑和删除集合中的项目。但是没有动态添加新的,我的意思是为新的Address生成一个子表单。在Symfony中有一个名为"prototype"的东西,一个为集合中的项生成表单的简单函数。它生成名为name="addresses[__name__][city]"的输入。然后我需要在JS __name__中用系统中适当的项目索引替换。我在凤凰城找不到任何相同的东西。

我做了一个丑陋的代码,其工作方式类似于Symfony:

<% {:safe, prototype}
  = form_for App.User.changeset(
      %App.User{addresses: [%App.Address{}]}
    ), "", fn f2 ->
    inputs_for f2, :addresses, fn i2 ->
      render("form_address.html", i: i2)
    end
  end
%>

<div data-prototype="<%= prototype %>">
  <%= inputs_for f, :addresses, fn i -> %>
    <%= render "form_address.html", i: i %>
  <% end %>
</div>

<button type="button">
  Add address
</button>

当我点击添加地址时,JS会使用适当的索引替换输入属性中的[0]_0_(例如name="addresses[0][city]"),并在集合中添加新项。它有效,但是有没有正确的方法呢?

1 个答案:

答案 0 :(得分:0)

我为Phoenix创建了自己的表单库 - Formex。它支持nested formscollections of forms,即one_to_oneone_to_many关系。