2016-07-02 5 views
1

Я исхожу из рамки PHP Symfony2. Представьте, что вы есть модели User и AddressPhoenix 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]") с надлежащими индексами и добавляет новый элемент в коллекции. Это работает, но есть ли правильный способ сделать это?

+0

Я думаю, что этот другой вопрос может помочь вам http://stackoverflow.com/questions/32054561/how-to-handle-associations-and-nested-forms-in-phoenix-framework – neydroid

+0

@neydroid в ответ на этот вопрос была ассоциация 1-1, с жестко запрограммированной в контроллере один «двигатель» на один «автомобиль», поэтому Phoenix смог создать красиво эту одну подформу. Мне нужно динамически добавлять новую подформу через JavaScript в ассоциацию 1-много. –

ответ

0

Я создал свою собственную библиотеку форм для Phoenix - Formex. Он поддерживает nested forms и collections of forms, то есть one_to_one и one_to_many отношений.

Смежные вопросы