Я исхожу из рамки PHP Symfony2. Представьте, что вы есть модели User
и Address
Phoenix HTML - как создать вложенную форму
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]"
) с надлежащими индексами и добавляет новый элемент в коллекции. Это работает, но есть ли правильный способ сделать это?
Я думаю, что этот другой вопрос может помочь вам http://stackoverflow.com/questions/32054561/how-to-handle-associations-and-nested-forms-in-phoenix-framework – neydroid
@neydroid в ответ на этот вопрос была ассоциация 1-1, с жестко запрограммированной в контроллере один «двигатель» на один «автомобиль», поэтому Phoenix смог создать красиво эту одну подформу. Мне нужно динамически добавлять новую подформу через JavaScript в ассоциацию 1-много. –