Rails: динамически удаляет вложенный объект формы
У меня есть форма для добавления вложенных объектов, например:
Это основная форма:
#purchasing_goals.html.erb
<%= f.fields_for :group_goals do |builder| %>
<%= render partial: 'group_goal_fields', locals: { f: builder } %>
<% end %>
<div>
<%= link_to_add_fields("Add", f, :group_goals) %>
</div>
и это вложенная форма:
<div class="group-goal">
<%= f.text_field :num_of_users, label: "No. Usuarios" %>
<%= f.text_field :discount_percentage, label: "Descuento" %>
<%= f.hidden_field(:_destroy) %>
<%= link_to_remove_fields("Delete", f, "'.group-goal'") %>
</div>
и это помощники для добавления и удаления элементов group_goals:
def link_to_remove_fields(name, f, removal_class)
link_to name, "javascript:void(0);", onclick: "remove_fields(this, #{removal_class})"
end
def link_to_add_fields(name, f, association)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s.singularize + "_fields", :f => builder)
end
link_to(name, "javascript:void(0);", onclick: "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
end
Он отлично работает, он добавляет новый элемент, когда вы нажимаете кнопку "Добавить", однако, когда я нажимаю кнопку "Удалить", он удаляет элемент в форме, но не в параметрах формы, поэтому, когда я нажимаю кнопку отправки пустой вложенный объект отправляется в контроллер. Как сделать так, чтобы кнопка удаления удаляла элемент не только в форме (визуально), но и удаляла созданный объект?
заранее спасибо
2 ответа
Вы должны использовать следующее:
<% content_tag :div, class: "group-goal", id: f.options[:child_index] do %>
<%= f.text_field :num_of_users, label: "No. Usuarios" %>
<%= f.text_field :discount_percentage, label: "Descuento" %>
<%= f.hidden_field(:_destroy) %>
<%= link_to "Remove", "#", class: "remove", %>
<% end %>
Это позволит вам использовать следующее:
#app/assets/javascripts/application.js
$(".group_goal a.remove").on("click", function(e){
$(this).parents(".group_goal").remove();
});
Вы должны помнить, что "динамический" fields_for
элементы являются просто элементами поля HTML, и, следовательно, могут быть удалены из DOM с помощью javascript/jquery.
Вы используете старый способ Railscast для достижения этого (те, link_to_add_fields
вспомогательные методы устарели).
Типичным способом достижения этого является использование Cocoon
gem, или сделать это вручную, используя такие ответы: Rails accepts_nested_attributes_for с f.fields_for и AJAX
Я гость, вы должны сделать несколько шагов, чтобы исправить это. Проверьте ваш сильный параметр в вашем контроллере и добавьте _destroy
а также id
def hotel_params
params.require(:purchasing_goal).permit(:your_own_field, group_goals_attributes: [ :id, :num_of_users, :discount_percentage, :_destroy ])
end
Далее проверьте ваш purchasing_goal.rb
модель для добавления allow_destroy: true
accepts_nested_attributes_for :group_goals,
reject_if: proc { |attributes| attributes['num_of_users'].blank? },
allow_destroy: true
Я надеюсь, что это поможет вам. Для получения дополнительной информации nested_forms-rails-4.2