我来自PHP Symfony2框架。想象一下,你有模型User
和Address
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]"
),并在集合中添加新项。它有效,但是有没有正确的方法呢?
答案 0 :(得分:0)
我为Phoenix创建了自己的表单库 - Formex。它支持nested forms和collections of forms,即one_to_one
和one_to_many
关系。